Вызов функции скрипта :функция против $ (функция)

Я думаю, что awk-версия намного лучше, но вот bash-версия просто для развлечения:)

out="";
while read line;
do
    if [ "$prevtime" != "$line" ];then
        out="${out}${line}\n";
    else
        out="$(echo -e "${out}"|head -n -2)\n";
    fi ;
    echo  "${line}" |grep -q  "\-\->" &&  prevtime=$line  ;
done <test.srt ; echo -e "$out"
3
16.06.2021, 00:26
1 ответ

Вы испытываете тонкости подстановки команд.

Звонок

doSomething

— простой вызов функции. Он выполняет функцию почти так же, как если бы вы скопировали -и -вставили команды функции в то место, где вы ее вызываете. Следовательно,он перезаписывает переменную numberновым значением 8.

Звонок

$(doSomething)

, с другой стороны, является заменой команды . Он предназначен для выполнения функции и возврата того, что функция напечатала вstdout. Обычно он используется не «отдельно», а в присваиваниях переменных, например,

os_type=$(uname)

Это выполнит команду uname, которая в системе Linux выведет Linuxна консоль и сохранит результат в переменной оболочки os_type. Следовательно, нет смысла использовать подстановку команды с командой или функцией, которая ничего не выводит, например, doSomething. Действительно, поскольку подстановка $(doSomething)в основном является заполнителем для вывода doSomething, единственная причина, по которой вы не получаете ошибку сценария, заключается в том, что ваша функция ничего не выводит. Если бы вы заявили, например,

$(uname)

вместо

$(doSomething)

ваша оболочка попыталась бы выполнить команду Linuxи сгенерировала

Linux: No such file or directory

ошибка(1).

Ключевым моментом для понимания эффекта, который вы наблюдаете, является то, что при подстановке команд команда выполняется в подоболочке , т. е. любые изменения, сделанные в переменных, не распространяются обратно на оболочку, в которой вы выполняете основную команду. сценарий. Поэтому, хотя внутри он выполняет команды doSomethingи устанавливает переменную numberв 8, он делает это в своем собственном процессе оболочки, который не имеет ничего общего с процессом оболочки, который запускает ваш сценарий (, за исключением тот факт, что его stdoutизвлекается )и, следовательно, не может изменить переменную number, которую вы использовали в основном скрипте.

Для дальнейшего чтения вы можете посмотреть

здесь, на этом сайте,или

для большего обзора.


(1)С другой стороны, это означает, что вы можете использовать подстановку команд для выполнения команды, имя которой вы не знаете на момент написания сценария, но которое вы можете узнать, выполнив другую команду, которую вы знаете знать.

10
28.07.2021, 11:24

Теги

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