Скрипт /bin/sh — как определить, является ли аргумент 1 или 2?

Вы обновили libc (самую простую системную библиотеку ), и теперь ни одна программа не работает. Если быть точным, ни одна динамически подключаемая программа не работает.

В вашем конкретном случае перезагрузка должна помочь. Для установленной сейчас -libc требуется более новое ядро, и если вы перезагрузитесь, вы получите это более новое ядро.

Пока у вас все еще есть работающая оболочка, часто существует способ восстановления, но это может быть сложно, если вы этого не планировали. Если у вас нет оболочки, то обычно нет другого решения, кроме перезагрузки.

Здесь вы, возможно, не сможете восстановиться без перезагрузки, но вы, по крайней мере, сможете легко узнать, какое ядро ​​запущено. Просто используйте способ чтения /proc/version, который не требует внешней команды.

read v 

Если у вас все еще есть копия старой libc, вы можете запускать программы с ее помощью. Например, если старая libc находится в /old/libи у вас есть исполняемые файлы, которые работают с этой старой libc в /old/bin, вы можете запустить

LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname

Если у вас есть статически связанные двоичные файлы, они все равно будут работать. Я рекомендую установить статистически связанные системные утилиты для такого рода проблем (, но вы должны сделать это до того, как проблема начнется ). Например, в Debian/Ubuntu/Mint/… установите один или несколько из busybox -static(набора основных инструментов командной строки Linux, включая оболочку ), sash(оболочку. с некоторыми дополнительными встроенными модулями ), zsh -static(просто оболочка, но с несколькими встроенными удобными инструментами ).

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '

-2
24.10.2019, 11:08
2 ответа

Чтобы проверить, является ли аргумент скрипта 1или 2, вы можете просто использовать оператор case.

В приведенном ниже коде предполагается, что вы хотите проверить$1:

case $1 in
    [12])
        # $1 is 1 or 2
        ;;
    *)
        # $1 is not 1 and not 2
esac

Нет реальной необходимости проверять, является ли аргумент допустимым целым числом или нет, так как вас интересуют только два конкретных значения, и их можно легко проверить как строки. Значения переменных оболочки всегда являются строками, если они не используются в арифметическом контексте, и здесь нет причин делать это.

Вы также можете использовать явный оператор if:

if [ "$1" = '1' ] || [ "$1" = '2' ]; then
    # $1 is 1 or 2
else
    # $1 is not 1 and not 2
fi
2
28.01.2020, 05:16

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

https://stackoverflow.com/questions/2210349/test-whether-string-is-a-valid-integer

и чтобы проверить отсутствие переменной, скажем, вы присваиваете свой первый аргумент переменной

var=$1

 if [ ! -z "$var" ]; then
    echo "value is present"
 else
    echo "value is not present"
 fi 
-1
28.01.2020, 05:16

Теги

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