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

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

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

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          

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

答え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"

覚えておいて、プログラムに引数を渡し、引数にスペースが含まれている場合は、プログラムがそれを単一の引数として扱うために二重引用符を使用する必要があります。

関連情報