
ファイルの各行に対して異なるスクリプトを実行するスクリプトがあります。
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
(パスワードがコロンで終わらない限り動作します)
答え2
引数にスペースが含まれている場合は、文字列が複数の引数として解釈されないように二重引用符で囲む必要がありますconnect.sh
。文字列を複数のパラメータに分割できます。その行の形式が何であるかはわかりませんが、次のようにできます。
line="user name user password"
# Split the line into space-separated tokens and store 1 and 2
UNAME=$(echo "$line" | cut -d ' ' -f 1,2)
# Split the line into space-separated tokens and store 3 and 4
UPASSWD=$(echo "$line" | cut -d ' ' -f 3,4)
echo "$UNAME"
echo "$UPASSWD"
次のように印刷する必要があります。
user name
user password
入力ラインの実際の形式によっては、いくつかの調整が必要になる場合があります。たとえば、$line にユーザー名とユーザーパスワードがコンマで区切られている場合は、次のように実行できます。
line="user name,user password"
# Split the line into comma-separated tokens and store 1
UNAME=$(echo "$line" | cut -d ',' -f 1)
# Split the line into comma-separated tokens and store 2
UPASSWD=$(echo "$line" | cut -d ',' -f 2)
echo "$UNAME"
echo "$UPASSWD"
覚えておいて、プログラムに引数を渡し、引数にスペースが含まれている場合は、プログラムがそれを単一の引数として扱うために二重引用符を使用する必要があります。