テキストファイルから変数を渡す際に奇妙な問題が発生しました。

テキストファイルから変数を渡す際に奇妙な問題が発生しました。

ファイルの各行に対して異なるスクリプトを実行するスクリプトがあります。

echo予想通り、毎回$line行の内容全体を見ることができる場合。

ただし、connect.sh内部的にのみ$1設定されますuser\ name

を使用しようとすると、"$line"結果$1connect.shですuser\ name user\ password

reboot.shtoの各行が2つのパラメータに渡されるようにプログラムフローをどのように設定しますか?/tmp/historyconnect.sh

最終結果$1は?user\ name$2user\ 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          

(パスワードがコロンで終わらない限り動作します)

おすすめ記事