0

次のような引数としてファイルを受け取るbashスクリプトがあります

>myscript dir/smalldir/file1.txt file3.txt

今、私は引数を保存したいと思います:

>args=$@

また、

>args=$*

しかし、それを使用しようとすると、次のように出力されます。

dirsmalldirfile1.txt file3.txt 

スラッシュなし。どうすればこれを修正できますか? 私はbashが初めてで、宿題があります。

ありがとうございました。

4

1 に答える 1

2

フィールド間のセパレータである IFS の設定を変更すると、表示される結果に近づくことができます。

$ set -- "/abc/def/ghi" "jkl" "mno pqr/stu vwx"
$ print "%s\n" "$@"
abc/def/ghi
jkl
mno pqr/stu vwx
$ echo "$@"
abc/def/ghi jkl mno pqr/stu vwx
$ IFS=/
$ echo $@
abc def ghi jkl mno pqr stu vwx
$ IFS=$' \t\n'
$

これは単語を一緒に実行しませんが、スラッシュを失います。問題をより正確に診断するには、スクリプト内により多くのコードを提供する必要があります。


スラッシュが消える問題とは別に、引数を保存する必要がある場合は、実際に次を使用する必要があります。

args=("$@")

これにより、ファイル名が配列に保存され、名前が分離され、スペースが正しく処理されます。その後、0 から始まるインデックスを使用して個別のファイル名にアクセスできます。

echo "${args[1]}"
echo "${args[@]}"
for file in "${args[@]}"; do ...; done

質問で使用される表記は次のとおりです。

args=$*
args=$@

これらはどちらも、元の名前をスペースで区切った単一の文字列にファイル名を保存します。元のファイル名にスペースが含まれている場合、これを元のファイル名に確実に分割することはできません。ほとんどの場合、これはあなたが望むものではありません。

于 2013-05-29T21:26:54.180 に答える