入力が「はい」の場合は、スクリプトを再実行します。

入力が「はい」の場合は、スクリプトを再実行します。

私は単純なファイル処理スクリプトを書いていますが、最後を除いてうまくいきます。私が言うことは、do you want to perform another action答えが「はい」であれば、yesスクリプトを再起動したいということです。一種のループが必要であることを知っていますか?これが私が持っているものです:

#/bin/bash


echo "Select an option from copy , remove , rename , linking"
#read in user input into the action variable

read action

# if action is copy then continue proceed with the following
if [ $action = "copy" ]
then
echo "Please enter the filename you wish to copy"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
echo "Please enter the new filename"
read filenamenew
cp $filename $filenamenew
echo "$filename has been copied to $filenamenew"

# if action is remove then continue proceed with the following
elif [ $action = "remove" ]
then
echo "Please enter the filename you wish to remove"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
rm -rf $filename
echo "$filename has been deleted"

# if action is rename then continue proceed with the following
elif [ $action = "rename" ]
then
echo "Please enter the filename you wish to rename"
read filename
# check if filename exists, if it doesn't then exit program
    if [ ! -e  $filename ] 
    then
    echo "$filename does not exist"
    exit 1
    fi
echo "Please enter the new filename"
read filenamenew
mv $filename $filenamenew
echo "$filename has been renamed to $filenamenew"
fi

echo "Do you want to perform another file operation (yes/no) ?"
read answer

if [ $answer = yes ]
then "run script again"
exit 0
    elif [ $answer = no ]
    then echo "Exiting Program"
    exit 0
    fi
fi

答え1

echo「作業を選択してください...」前

answer=yes
while [ "$answer" = yes ]
do

最後に交換

if [ $answer = yes ]
then "run script again"
exit 0
    elif [ $answer = no ]
    then echo "Exiting Program"
    exit 0
    fi
fi

渡す

if [ "$answer" = yes ]
then "run script again"
fi

done

echo "Exiting Program"
exit 0

私がしたことはプログラムをwhile [$condition ] do ; ... done

answer=yes最初のループの条件がOK()であることを確認してください。

答え2

ループに対する答えは、この問題を解決するための良い方法です。しかし、参考までにスクリプト自体を再度呼び出すことには問題はありませんので、/usr/local/bin/myscript以下をお読みください。

#!/bin/sh
...
if [ yes = "$answer" ]; then
  /usr/local/bin/myscript
fi

それ以外の場合は自動的に発生するため、必要はありませんexit 0。また、スクリプトの最後の作業ディレクトリが最初の作業ディレクトリと同じであることがわかっている場合は、スクリプトパスをハードコードせずに$0

この最後の改善が重要です。作成されたように、最初の最初のスクリプトプロセスは2番目のスクリプトプロセスを作成し、完了するのを待ってから、2番目のスクリプトプロセスが3番目のスクリプトプロセスを作成して完了するのを待ちます。これはリソースを消費し、これらのスクリプトの子が終了すると、これらのスクリプトには実際には何もしません。したがって、「テールコール」と同等のプログラミングを使用して実行する方が良いです。これは次のコマンドを使用して行われますexec

#!/bin/sh
...
if [ yes = "$answer" ]; then
  exec /usr/local/bin/myscript # or exec $0
fi

2番目のプロセスの開始時に最初のプロセスが終了し、2番目のプロセスが完了したときに3番目のプロセスが作成されない場合は、最初のプロセスを開始した人に直接戻ることを除いて、前と同じです。おそらくシェルでしょう。

答え3

スクリプトを関数にラップして再帰的に呼び出します。

#/bin/bash
do_file_action(){
  echo "Select an option from copy , remove , rename , linking"
  #read in user input into the action variable

  read action

  ...

  echo "Do you want to perform another file operation (yes/no) ?"
  read answer

  if [ $answer = yes ]
  then do_file_action
  exit 0
      elif [ $answer = no ]
      then echo "Exiting Program"
      exit 0
      fi
  fi
}

do_file_action

関連情報