Bash: Ошибка в присвоении значения по умолчанию переменной

возможно, вы использовали одинарные кавычки, которые не позволяют вычислять переменную, и сохраните ее как 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:~$

1
12.01.2019, 14:45
1 ответ

Из справочной страницы 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. Я только что придумал это, и я не уверен, что это правильный способ изменить один позиционный параметр.

4
27.01.2020, 23:23

Теги

Похожие вопросы