5

ファイルから引数を読み込んでコマンドを実行したいのですが。引数の1つにスペースが必要になるまで、これは正常に機能します。

単語を引用符と円記号でグループ化しようとしましたが、どちらも機能しませんでした。

xargsスクリプトの他の場所で設定された他の変数に依存するため、コマンドではなく関数を呼び出す必要があることを除いて、私が求めている機能はまさにその機能です。

脚本:

do_echo() {
    echo '$1:' $1
    echo '$2:' $2
}
line=`cat input.txt` #cat used for simplicity, can have more than 1 line
do_echo $line

input.txt:

"hello world" "hello back"

期待される結果:

$1: hello world
$2: hello back

観測結果:

$1: "hello
$2: world"

編集:

これを使用して、同じコマンドを異なる入力で複数回実行しています。1行あたり最大15個のパラメーターがあり、50行以上になる可能性があります。

表形式が理想的ですが、各パラメーターを1行に配置するという現在の答えは機能します。

4

2 に答える 2

4

引用符で囲まれていない変数(のように)は、変数(デフォルトではタブ、スペース、改行に設定されています)にdo_echo $line含まれる任意の文字で厳密に分割されます。IFS厳密には、本当に厳密に意味します。分割を引用したり、エスケープしたりする方法はありません。

基本的な回避策は、他の方法では不要な文字(コロンなど:)を分割文字として定義することです。

例えば

$ cat input.txt
hello world:hello back
$ line=$(head -n 1 input.txt)
$ OLDIFS=$IFS IFS=:
$ do_echo $line
$1: hello world
$2: hello back
$ IFS=$OLDIFS

別の回避策はを使用してevalevalますが、危険です。あなたは絶対に入力を信頼しなければなりません!

$ cat input.txt
"hello world" "hello back"
$ line=$(head -n 1 input.txt)
$ eval do_echo "$line"
$1: hello world
$2: hello back
于 2012-08-24T14:43:47.207 に答える
3

引用符を使用する代わりに、個々の引数に表示されないことが保証されている文字を使用して、各引数を区切ります。たとえば、セミコロンを使用すると、次のようになります。

hello world;hello back
argument 1;argument 2

次に、次を使用して、一度に1つのバッチで一連の引数を読み取ることができますread

while IFS=';' read -a arguments; do
    do_echo "${arguments[@]}"
done < input.txt

ユニット区切り文字(ASCII 0x1f)のようなあいまいなASCII制御文字は、ファイルに入力できる場合、引数に表示される可能性が低くなります。

于 2012-08-24T14:21:09.580 に答える