2017-09-30 14 views
0

私のスクリプトで3つ以上の引数を取ることができる問題があります。私のスクリプトは、例えば、このようなコマンドになります:Bashで複数のコマンドライン引数を処理する方法は?

./myscript.sh -i -v -r filename

をこれまでのところ、それは2つのだけの引数に加えて、ファイル名を取る場合:

./myscript.sh -i -v filename

私は完全なコマンドを実行すると、[-i] [-v] [-r]ことができますこのエラー...

"mv:無効なオプション - 'r' 詳細については、 'mv --help'を試してください。ここ

は、これまでの私のコードです....

#!/bin/bash 

dirfile='.trash' 

verbose= 

function helpfunction() 
{ 
    echo "=============== HELP COMMAND =============" 
    echo "" 
    echo "-h | --help" 
    echo "-i | --interactive" 
    echo "-v | --verbose" 
    echo "-r | --recursive" 
    echo "" 
} 

if [ $# -eq 0 ]; then 
    echo "no commands" 
    exit 1 
fi 


option="${1}" 
case ${option} in 
    -h | --help) 
      helpfunction 
      exit 
     ;; 

    #interactive -i or --interactive 
    -i) FILE="${*}" 
     echo "File name is $FILE" 
      echo -n "Do you want to remove this file (y/n)? " 
      read answer 
      if echo "$answer" | grep -iq "^y" ;then 
       mv $FILE $dirfile 
      fi 
     ;; 

    #verbose -v or --verbose 
    -v) FILE="${*}" 
      if [ -f "$FILE" ]; then 
       -v $FILE 
      fi 
     ;; 

    #recursive -r or --recursive 
    -r) FILE="${*}" 
      if [ -d "${*}" ]; then 
       rm -r "$FILE" 
      fi 
     ;; 

    #unremove -u or --unremove 
     -u) FILE="${*}" 
       for file in $dirfile*; 
       do 
        if [[ -f $file ]]; then 
         echo "file found" 
        else 
         echo "File not found" 
        fi 
       done 
      ;; 

    #list -l or --list 
     -l) FILE="${*}" 
       for entry in "$dirfile"/* 
       do 
        echo "$entry" 
       done 
      ;; 

     *) 
      echo "`basename ${0}`:usage: [-f file] | [-d directory]" 
      exit 1 # Command to come out of the program with status 1 
      ;; 
esac 
+0

リストの最初に必要なエントリを作成します – soft87

+0

どのようにしてですか?私はシェルスクリプトの初心者です。 –

+0

最初の引数はファイル名($ 1) – soft87

答えて

0

あなたは

FILEを言うとき= "$ {*}"

あなたは一人として、残りのすべての引数を取っています文字列を作成し、それをFILEに割り当てます。これは、スクリプトの先頭に 'set -x'を追加することで確認できます。

opus$ ./myscript.sh -i -v -r filename 
+ '[' 4 -eq 0 ']' 
+ option=-i 
+ case ${option} in 
+ FILE='-i -v -r filename' 
+ echo 'File name is -i -v -r filename' 
File name is -i -v -r filename 
+ echo -n 'Do you want to remove this file (y/n)? ' 
Do you want to remove this file (y/n)? + read answer 
y 
+ grep -iq '^y' 
+ echo y 
+ mv -i -v -r filename 
mv: invalid option -- 'r' 
Try 'mv --help' for more information. 

$ 1が最初の引数です。それを発見したら、shiftを使って次の引数を$ 1としてロードし、そのようにそれらのサイクルを繰り返すことができます。

また、組み込みのgetops引数パーサーを使用することもできます。

あなたはここでは、このラインで mv $FILE $dirfile

をエラーを取得しているジョー・

+0

それは意味があります、私はどのようにファイルまたはディレクトリ名を取ることができますか?しかし、[-i、-v、-r]ではありません –

+0

私は最後の応答の最後にそのことについていくつか考えました。 –

0

は、デバッグモードでスクリプトの実行です。

bash -x ./myscript.sh -i -v -r test.txt 
+ dirfile=.trash 
+ verbose= 
+ '[' 4 -eq 0 ']' 
+ option=-i 
+ case ${option} in 
+ FILE='-i -v -r test.txt' 
+ echo 'File name is -i -v -r test.txt' 
File name is -i -v -r test.txt 
+ echo -n 'Do you want to remove this file (y/n)? ' 
Do you want to remove this file (y/n)? + read answer 
y 
+ echo y 
+ grep -iq '^y' 
+ mv -i -v -r test.txt .trash 
mv: invalid option -- 'r' 
Try 'mv --help' for more information. 

-rはmvの有効な引数ではありません。

アップデートファイルと同じように、あなたのスクリプト= $ 4 あなたは-i -v -rたい場合は、オプションとして、あなたはまた、最後のパラメータを取得するため${!#}を使用することができ、このGetting the last argument passed to a shell script

次最後の引数を抽出することができます。

関連する問題