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첫 번째 명령줄 인수의 값으로 설정합니다. 단, 아무것도 제공되지 않는 한 string 으로 설정됩니다 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

관련 정보