저는 Solaris 10 시스템에서 Ksh88을 사용하고 있습니다.
다음을 수행하면:
foo="one two three"
for i in $foo; do
echo $i;
done
스크립트는 예상대로 실행됩니다.
$ ./script.ksh
one
two
three
그러나 루프를 다음과 같이 바꾸면:
foo="one two three"
for i in $(sed -e 's/bar/$foo/' <(echo $1));
do
echo $i
done
나는 그것을 실행하고 이것이 내가 얻는 것입니다:
$ ./script.ksh bar
$foo
for
명령 결과를 sed
변수로 확장하려면 어떻게 해야 합니까 ?
답변1
sed -e 's/bar/$foo/' <(echo $1)
인쇄 $foo
. 명령 확장 결과는 쉘 구문 처리의 영향을 받지 않습니다. 큰따옴표 밖에서 이 방법을 사용하면 필드 분할(단어로 분할) 파일 이름 생성(예: 와일드카드)의 영향만 받습니다.
어떤 쉘에서든 변수 이름이 다른 변수에 존재하는 경우 를 사용하여 변수 값을 가져올 수 있습니다 eval
.
variable_name=$(sed -e 's/bar/foo/' <(echo $1))
case $variable_name in
*[!0-9A-Z_a-z]*) echo 1>&2 "Invalid variable name: $variable_name"; exit 3;;
esac
eval variable_value="\${$variable_name}"
for i in $variable_value; do …
$variable_value
값이 공백으로 구분된 부분으로 구분될 뿐만 아니라 이러한 부분에서도 와일드카드가 수행됩니다(예: 와일드카드가 파일 이름으로 확장됨) . 와일드카드를 끄려면 set +f
미리 전화하세요.
ksh93에서는 변수를 정의할 때 특수 플래그를 사용할 수 있습니다 var
. 이는 변수의 값 자체가 변수 이름이고 $var
이름이 지정된 변수의 값으로 확장되어야 함 을 쉘에 알리는 것입니다 $var
. 또한 foo
실제로는 문자열이 아닌 문자열 목록이므로 배열을 만들어야 합니다 .
foo=(one two three)
typeset -n variable_name="$(sed -e 's/bar/foo/' <(echo $1))"
for i in "${variable_name[@]}"; do …
답변2
foo=$(echo "$foo" | sed 's/[\\\/]/\\&/g') # only required if $foo can contain one of \/
set +f # only required if $foo contains one of \[*?
for i in $(echo "$1" | sed -e "s/bar/$foo/"); do
echo $i
done