편집할 수 없는 다음 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 스크립트가 수행하는 유일한 작업은 이전 값에 관계없이 변수를 현재 환경의 값으로 설정하는 것입니다.test1
test1
test
test1
스크립트에기본값이는 스크립트에 명령줄 인수를 제공하여 재정의할 수 있습니다.
가장 간단한 경우에는 다음과 같습니다.
#!/bin/sh
value=${1:-test1}
printf 'value is %s\n' "$value"
변수 이름은 test
표준 유틸리티의 이름이기도 하므로 사용을 피했습니다. 문제를 일으키는 것은 아니지만 코드를 읽기 쉽게 만듭니다. 스크립트가 특정 기능을 사용하지 않기 때문에 - 줄에서도 /bin/sh
대신 사용하고 있습니다 . 그러나 , , 및 기타 POSIX 쉘을 통해 여전히 실행될 수 있습니다 .bash
#!
bash
bash
ksh
yash
zsh
이는 변수의 값을 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