3

実行したいbashスクリプトのコードは次のとおりです。新しいコンソールを開き、ファイルのリストを使用してclamscanを実行します

gnome-terminal -x sh -c "clamscan $@"

ここで展開した後、スクリプトに与えられた2つの引数が
file1.txt file2.txt

gnome-terminal -x sh -c 'clamscan file1.txt' file2.txt

ご覧のとおり、 のみclamscan file1.txtが実行されます。

別の方法でコードを記述しようとすると

gnome-terminal -x sh -c "clamscan \"$@\""

展開結果はこちら

gnome-terminal -x sh -c 'clamscan "file1.txt' 'file2.txt"'

それはうまくいきません。他の引用符の中
に適切に統合する方法を知っている人はいますか?"$@"

編集 私の目標は、拡張後に次のようなものにすることです

gnome-terminal -x sh -c 'clamscan "file1.txt" "file2.txt"'
4

4 に答える 4

3

からman bash

3.4.2 特殊パラメータ
@
1 から始まる定位置パラメータに展開されます。展開が二重引用符内で発生すると、各パラメーターは個別の単語に展開されます。つまり、「$@」は「$1」「$2」に相当します…。

重要な部分はequalであり、 に展開されませ"$1" "$2"。つまり、二重引用符を使用します。それが必要な場合は、2 つの選択肢があります。パラメーターを自分で準備します。

for i in "$@"; do
    args="$args \"$i\""
done

gnome-terminal -x clamscan $args

またはコマンドラインの一部をスクリプトに入れます

script.sh:

clamscan "$@"

そしてそれを呼び出します

gnome-terminal -x script.sh file1.txt file2.txt
于 2013-02-22T12:40:11.133 に答える
2

これを試して

#!/bin/bash

params=("$@")

for i in "${params[@]}"
do
    string="${string} \'$i\'"
done;

// subst with your full command, this is only for test purposes
sh -c "echo ${string}"  

テスト:

[root@myhost test]# sh ./script.sh aaaa "bbbb cccc"
'aaaa' 'bbbb cccc'
于 2013-02-22T12:35:57.143 に答える
1

変数置換を使用できます:${@/ /\\ }

于 2013-02-22T19:04:11.080 に答える
0

試す:

gnome-terminal -x sh -c `echo "$@"`

ただし、スクリプトが最終的に何をしようとしているのかはよくわかりません (ファイル名にスペースが含まれている可能性のある 1 つまたは複数のファイルを実行したいようです)。

于 2013-02-22T12:00:43.913 に答える