Bashスクリプトのコマンドラインで変数を変更する

Bashスクリプトのコマンドラインで変数を変更する

編集できない次のbashスクリプトがあります(多すぎます)。

#! /bin/bash/
#filename: testbash
# User specific aliases and functions
test="test1"
echo $test

テスト変数の変更中にtestbashをソースとして実行できますか?つまり:

>> . testbash
test1
>> . testbash -someargument(test="newtest")
newtest

答え1

問題を完全に理解したかどうかはわかりませんが、これがあなたが望むものだと思います。

はい

[root@HomeTraining ~]$ cat example 
#!/bin/bash
VAR1=$1
echo "$VAR1"

ここで、$ 1はコマンドの最初のパラメータです。

[root@HomeTraining ~]$ . example New_Text
New_Text

欲しいものがたくさんできると思います。

#!/bin/bash
VAR1=$1
VAR2=$2
echo "$VAR1 $VAR2"

$ . example one two
one two

答え2

現在のスクリプトがどのように書かれているか(無条件文字列を変数に割り当てて印刷する)ことを考えると、スクリプトにnotの別の値を表示させることはできません$test。スクリプトを入手することは役に立ちません。 getスクリプトが実行する唯一のことは、以前の値に関係なく、変数を現在の環境の値に設定することです。test1test1testtest1


スクリプトにデフォルトこれは、スクリプトにコマンドライン引数を提供することでオーバーライドできます。

最も簡単な場合は次のようになります。

#!/bin/sh

value=${1:-test1}
printf 'value is %s\n' "$value"

変数名はtest標準ユーティリティの名前でもあるため、使用を避けました。問題を引き起こすわけではありませんが、コードを読みやすくします。スクリプトは特定の機能を使用しないため、 - 行でも/bin/sh代わりに使用しています。ただし、、、およびその他のPOSIXシェルを介してまだ実行できます。bash#!bashbashkshyashzsh

これは変数の値をvalue最初のコマンドライン引数の値に設定します。ただし、何も提供されない限り文字列に設定されますtest1。これは空の文字列であるか、変数が設定されていない場合に拡張される標準パラメータの置換です${parameter:-word}word$parameter

テスト:

$ ./script.sh
value is test1
$ ./script.sh hello
value is hello

スクリプトが-v単一のオプション引数を取るオプションを取ることができるようにします。

#!/bin/sh

value=test1

while getopts 'v:' opt; do
    case $opt in
        v) value=$OPTARG ;;
        *) echo 'error in command line parsing' >&2
           exit 1
    esac
done

# not needed if you're not expecting operands after the options
# on the command line:
shift "$(( OPTIND - 1 ))"

printf 'value is %s\n' "$value"

最後のスクリプトをテストします。

$ ./script.sh
value is test1
$ ./script.sh -v hello
value is hello

関連情報