возможно, вы использовали одинарные кавычки, которые не позволяют вычислять переменную, и сохраните ее как str!
вы можете поместить эту полезную функцию в свой bashrc или где угодно
setenv ()
{
(($#)) && {
[[ $# -gt 1 ]] && {
local v=$1
shift
case "$@" in
*'('*) #check if array
eval `echo $v=$@` ;
;;
*)
eval `echo $v="$@"` ;
;;
esac
} || {
eval echo "\$$1"
}
} || {
echo "$FUNCNAME set|get var|arr"
}
}
younes@h:~$ setenv
setenv set|get var|arr
younes@h:~$ setenv foo 'bar baz'
younes@h:~$ setenv foo
bar baz
younes@h:~$ setenv foo '(foo bar baz)'
younes@h:~$ setenv foo
foo
younes@h:~$ setenv {foo[@]}
foo bar baz
younes@h:~$ setenv {foo[0]}
foo
younes@h:~$ setenv {foo[1]}
bar
younes@h:~$ setenv {foo[2]}
baz
younes@h:~$ setenv {#foo[@]}
3
younes@h:~$
Из справочной страницы bash:
Positional Parameters
A positional parameter is a parameter denoted by one or more digits,
other than the single digit 0. Positional parameters are assigned from
the shell's arguments when it is invoked, and may be reassigned using
the set builtin command. Positional parameters may not be assigned to
with assignment statements. The positional parameters are temporarily
replaced when a shell function is executed (see FUNCTIONS below).
и выше, в разделе Расширение параметра
${parameter:=word}
Assign Default Values. If parameter is unset or null, the
expansion of word is assigned to parameter. The value of param‐
eter is then substituted. Positional parameters and special
parameters may not be assigned to in this way.
Если вы хотите присвоить значение по умолчанию позиционному параметру $1
, как в вашем вопросе, вы можете использовать
if [ -n "$1" ]
then
CWD="$1"
else
shift 1
set -- default "$@"
CWD=default
fi
Здесь я использовал комбинацию shift
и set
. Я только что придумал это, и я не уверен, что это правильный способ изменить один позиционный параметр.