1

私はシェルスクリプトにかなり慣れていないので、少し混乱し、これに対する解決策を見つけることができなかったようです. いくつかの引数を取ることができるシェルスクリプトがあるとしましょう。例として、次のように呼び出すことができます。

myscript -a valA -b valB -c valC -d valD 一部/ディレクトリ

ここで、これらの引数の一部はスクリプト自体用であり、他の引数はスクリプト内で呼び出されるコマンド用です。したがって、この場合、-a、-d、およびディレクトリはスクリプト用であり、それ以外はすべてコマンド用です。だから私はこのようなことをしたい:

args=''

if [ $# == 0 ]
then
    echo "No arguments found!"
    exit 1
fi

while [ "$2" ]
do
    if [ $1 == '-a' ]
    then
        #some process here
        shift 2
    elif [ $1 == '-d' ]
    then
        #some process here
        shift 2
    else
        #add the argument to args
        shift
    fi
done
directory=$1

for file in $directory/*.txt
do 
    #call 'someCommand' here with arguments stored in args + $file
done

やってみました

args="$args $1"

次に、実行するコマンドを呼び出します

someCommand "$args $file"

しかし、someCommand は、全体が 1 つの引数であると考えているようです。

また、私のスクリプトの残りの部分に問題がある場合は、遠慮なく指摘してください。動作しているように見えますが、いくつかのまれなケースを見逃していたり​​、予期しない動作につながる可能性のあることを行ったりしている可能性が非常に高いです。

ありがとう!

4

3 に答える 3

1

引用符を削除するだけです。

someCommand $args "$file"
于 2012-09-07T17:43:12.590 に答える
1

配列を使用します。

newargs=()
newargs+="-9"
newargs+="$somepid"
kill "${newargs[@]}"
于 2012-09-07T17:25:20.283 に答える
0

使用set:

set man ページから: オプションを指定しないと、各シェル変数の名前と値が、入力として再利用できる形式で表示されます。出力は、現在のロケールに従ってソートされます。オプションを指定すると、シェル属性が設定または設定解除されます。オプションが処理された後に残っている引数は、位置パラメータの値として扱われ、順番に $1、$2、... $n に割り当てられます。

args=''

if [ $# == 0 ]
then
    echo "No arguments found!"
    exit 1
fi

while [ "$2" ]
do
    if [ $1 == '-a' ]
    then
        echo "Consuming $1 $2"
        shift 2
    elif [ $1 == '-d' ]
    then
        echo "Consuming $1 $2"
        shift 2
    else
        args="$args $1"
        shift
    fi
done
directory=$1

# *** call set here ***
set "$args"

for file in $directory/*.txt
do 
    # refer to the parameters using $@
    someCommand $@ $file
done
于 2012-10-10T10:24:15.617 に答える