if/then パラメーターlinux

if/then パラメーターlinux

また詰まっています。この場合、コマンドラインにファイル名を入力するときにテキスト変換を実行するために先週のタスクを実行しようとします。先週のスクリプトは、列を削除して並べ替えていくつかの文字を置き換え、いくつかのスペースを削除しました。今週の課題には、if / thenパラメーターを含めるようにスクリプトを変更する必要があります。

これが私が今まで持っているものです:

if [ $# -gt 0 ] 
then
    ./hw9.sh
else
     echo "Please enter a filename"
fi
name=First \Last
echo $name
starting_info=raw_info
date
#Pretend the rest of my original script is here#

したがって、テストして入力するとうまく./hw9.sh raw_infoいきますが、それでもPlease enter a filename元の./hw9.shスクリプトを2回エコーして実行します。Please enter a filenameユーザーがコマンドラインに入力するだけでエコーが発生し./hw9.sh、ユーザーが入力すると元のスクリプトを実行する必要があります。./hw9.sh raw_info

誰でも指示を提供できますか?ありがとうございます!

答え1

あなたの説明によると、あなたは呼び出されたスクリプトがあり、hw9.sh再帰実行条件を設定したと思います。

を実行すると、hw9.sh raw_info条件ifはtrue(= 1)で$#スクリプトが実行されます。hw9.shこのネストされた実行では、if条件はfalse($#= 0)なので、スクリプトはプロンプトをエコーし​​、そこから実行を続行します。ネストされた実行が完了すると、制御は親スクリプトに戻り、本文の後ろのスクリプトの残りの部分が実行されますif。したがって、スクリプトは実際には2回実行されます。

再帰を使用する代わりに、このような条件を使用して位置引数なしでケースをキャプチャできます。

if [[ $# -eq 0 ]];
then echo 'A filename is required.'
exit 1
fi

これは、複数の位置パラメータがある場合、またはパラメータが文字列 "raw_info"でない場合を考慮しません。これを追加することも検討できます。

また、最終スクリプトをベストプラクティスと一貫して維持するには、次の点を確認してください。https://www.shellcheck.net/

答え2

実際にファイル名を受け入れ、それを使用して操作を実行しない場合は、ファイル名を要求することは意味がありません。したがって、ファイルが提供され有効な通常のファイルである場合は、スクリプトがファイルで機能するようにし、ファイルが提供されていない場合は、スクリプトがデフォルトのファイル名で機能するようにします。また、いくつかの基本的なエラーチェックを追加します。

#!/bin/bash

## Set the default input file
file_name="raw_info"

# Exit if we have more than one argument
if [ $# -gt 1 ]; then
    echo "This script can only take one argument." >&2
    exit 1
# If we have exactly one argument, check that it is an existing file
elif [ $# -eq 1 ]; then
    if [ -f "$1" ]; then
      file_name="$1"
      echo "I will work on provided file '$file_name'."
    elif [ -d "$1" ]; then
        echo "You gave '$1', but that is a directory!"
        exit 2  
    else
        echo "You gave '$1' but it isn't an existing regular file!" >&2
        exit 3 
    fi
else
    if [ -e "$file_name" ]; then
        echo "No file name given, I will work on '$file_name'." >&2
    else
        echo "No file name given and default file name '$file_name' not found!" >&2
        exit 4
    fi
fi

### Assuming you want the script from https://unix.stackexchange.com/q/721051
cut -f3 -d, "$file_name" > first
cut -f2 -d, "$file_name" > last
cut -f1 -d, "$file_name" > id

スクリプトは、cut変数に保存されているすべてのファイルに対してコマンドを実行します。これは$file_name、スクリプトに引数が指定されていない場合はデフォルト値になり、引数を渡した場合は指定したすべての引数になります。エラーと情報メッセージを標準エラーとして送信するだけraw_infoです。>&2使用されているさまざまなテストのヒントについては、help testターミナルで実行してください。

関連情報