ファイルの各行に対して異なるスクリプトを実行するスクリプトがあります。
echo
予想通り、毎回$line
行の内容全体を見ることができる場合。
ただし、connect.sh
内部的にのみ$1
設定されますuser\ name
。
を使用しようとすると、"$line"
結果$1
はconnect.sh
ですuser\ name user\ password
。
reboot.sh
toの各行が2つのパラメータに渡されるようにプログラムフローをどのように設定しますか?/tmp/history
connect.sh
最終結果$1
は?user\ name
$2
user\ password
再起動.sh:
if [ -e "/tmp/history" ]; then
while read -r line; do
echo $line
connect.sh $line \
&& break
done </tmp/history
fi
接続.sh:
echo $1
echo $2
/tmp/歴史:
user\ name user\ password
ベストアンサー1
バックスラッシュは、値を分離しないように2つのスペースをエスケープすることを前提としています。
これにより、read -r line
変数の完全な行が取得され、line
バックスペースキーもline
含まれます。user\ name user\ password
技術がなければ分割するのは簡単ではありませんeval
。引用しない内容は$line
スペースとバックスラッシュで区切られます。引用の後、私はあなたが言うように言葉に展開されます。
幸いなことに、read
バックスラッシュを処理し、入力を複数の変数に分割できます。これにより、変数にuser name
次のものが含まれますuser password
(バックスラッシュを削除)。
while read user pass ; do
echo "user: $user"
echo "pass: $pass"
./connect.sh "$user" "$pass"
done < file
ただし、ユーザー名とパスワードでスペースを許可するには、スペース以外の区切り文字を使用することをお勧めします。コロンは一般的なので、次のような入力があります。
user name:user pass word
それでは読んでください。
while IFS=: read -r user pass ; do
echo "user: $user"
echo "pass: $pass"
done < file
(パスワードがコロンで終わらない限り動作します)