простой вопрос сценария оболочки. пожалуйста, дайте мне совет - PullRequest
0 голосов
/ 20 апреля 2020

У меня вопрос по поводу простого сценария оболочки.

Это исходный код rand. sh ниже

#!/bin/bash

n=$(( RANDOM % 100 ))
if [[ n -eq 42 ]]; then
    echo "Something went wrong"
    >&2 echo "The error was using magic numbers"
    exit 1
fi
echo "Everything went accrding to plan"

и я собираюсь чтобы создать новый сценарий оболочки, позвольте мне назвать его викторина. sh.

викторина. sh должно l oop до n == 42. если n == 42, сохраните stdout («Что-то пошло не так») и stderr («Ошибка при использовании чисел magi c»)

, и в конце концов он завершился печатью этих stdout, stderr и Total счетчик выполнения.

вот мой тест. sh

#!/bin/bash

cnt=0
while [[ "${n}" -ne 42 ]]
do
    (( cnt = "${cnt}"+1 ))
    source ./rand.sh &> error.txt
done
cat error.txt
echo "${cnt}"

, но это не работает. из-за exit 1 в rand. sh, программа завершается перед выполнением cat и echo, которые находятся в конце двух строк.

как я могу это исправить ?? пожалуйста, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Я хочу, чтобы это произошло, cat error.txt и эхо "$ {cnt}", а также

Запустите l oop в подоболочке

(
while something; do
    something
    exit 1 # exits only from the subshell
done
)

Примечание: родительская оболочка не получает доступ и не наследует среду дочернего процесса. Так что cnt будет пустым в родительской оболочке. Передайте его другим способом.

(
cnt=0
while ((n != 42)); do
    ((cnt++))
    echo "$cnt" > cntfile.txt
    # >& is deprecated
    source myrand > error.txt 2>&1
done
)
cnt=$(<cntfile.txt)
cat error.txt
echo "$cnt"

Ссылка Bash группировка команд вручную .

0 голосов
/ 20 апреля 2020

Как правильно указал KamilCuk, вы должны использовать $n вместо n.

Кроме того, я лично добавил бы, что использование source ./rand.sh &> error.txt довольно странно в этом случае. Если вы хотите запустить его как фоновый процесс, используйте:

./rand.sh &> error.txt &
wait $!  # $! is the pid

В противном случае просто сделайте из него функцию:

#!/bin/bash

function myrand {
    n=$(( RANDOM % 100 ))
    if [[ n -eq 42 ]]; then
        echo "Something went wrong"
        >&2 echo "The error was using magic numbers"
        return 1
    fi
    echo "Everything went accrding to plan"
    return 0
}


cnt=0
while [[ "${n}" -ne 42 ]]
do
    (( cnt = "${cnt}"+1 ))
    myrand() &> error.txt
done
cat error.txt
echo "${cnt}"

ps код не проверен, но я думаю, это работы.

...