2017-01-28 10 views
0

私は1つの引数($ 1)を取っているスクリプトを持っています。だから私は次のように実行します:bash script.sh file1.txt。しかし、私がより多くのファイル(bash script.sh *)を置きたいとき、彼はすべてから1つのファイルしか取ることができません。どうすればそれを動作させることができますか? $ 1としてのフォルダからすべてのファイルをscript.shに置き換えるか、それとも簡単な方法ですか?(Bash)多くのファイルをスクリプトに置き換えるには?

#!/bin/bash 
sed -i '/^$/d' [email protected] 
declare -a command 
while read -r line 
do 
    [[ "$line" =~ ^secretcommand$ ]] || continue 
    read -r cmd || break 
    eval "$cmd" 
    break 
done<"[email protected]" 

「$ @」では機能しません。

お願いします。

+0

スクリプトで '' $ @ "'を使用して目的を達成していますか? –

+0

[Bashスクリプトで引数を反復処理する方法]の可能な複製(http://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-a-bash-script) – SLePort

+0

'shift'を使います。引数がA B Cの場合、$ 1は "A"、$ 2は "B"などとなります。シフトを実行した後、 "A"は消え、$ 1は "B"となります。 – linuxfan

答えて

1

コード内のループは、指定されたファイルのすべての行を反復処理するように設計されています。すべてのファイルを反復処理するために外側ループを追加する必要があります。

#!/bin/bash 
sed -i '/^$/d' "[email protected]" 
for file in "[email protected]" 
    while read -r line 
    do 
    [[ "$line" =~ ^secretcommand$ ]] || continue 
    read -r cmd || break 
    eval "$cmd" 
    break 
    done<"$file" 
done 

あなたは(例えば上ごsedコマンドなど)コマンドの引数リストとしてそれを使用したいときの「$ @」を引用する必要がありますのでご注意ください。

+0

ありがとうございました! "bash script.sh *"のように実行すると正しく動作しますが、このように使用する場合は "sh script.sh *"と表示されます。出力に問題があり、あまり効果がありません。何故ですか? bashとshのようにスクリプトを実行する際の違いは何ですか?このスクリプトを使用してファイルワード "secretcommand"を検索し、次の行には常にコンソールで実行したいコマンドがあります。私はsedの空行で削除していました。なぜなら、ファイル内にキーワードとコマンドの間に空白行があり、スクリプトがコマンドが次の行にあるときだけ動作することがあるからです。 – Anna

+0

私が提案したコードは、bash固有の構文を使用しています(あなたの質問は 'bash'タグが付けられています)。 'sh'は別のシェルかもしれないので、' sh'で実行するとこの構文は機能しません。最初の行( '#!/ bin/bash'と一緒に)をスクリプトに含めましたか? – Fred

+0

最初の行( '#!/ bin/bash'と一緒に)をスクリプトに含めましたか?もしそうなら、スクリプトを 'chmod u + x'して、それをプログラムのように実行することができます(右のシェルは自動的に使用されます)。 – Fred

関連する問題