Я пытаюсь написать сценарий, который позволит мне получать аргументы при запуске сценария.Я могу сделать это с помощью $ @ в скрипте.
Но если я запустил сценарий с помощью / *
или * / *
, он выдаст список всех каталогов в / *
или * / *
.
Я хочу получить в качестве переменной в скрипте значение / *
и * / *
, если оно используется; вместо всех каталогов и файлов в / *
, всякий раз, когда запускается скрипт.
Я знаю, что проблема в том, как linux извлекает значения того, что связано с "*". Но не нашел решения для этого.
Ниже приведен пример сценария:
#!/bin/bash
int_v=0
get_str="$@"
for f in $get_str
do
if [ "$f" == "/*" ] || [ "$f" == "*/*" ] || [ "$f" == "/" ] || [ "$f" == "/boot" ] || [ "$f" == "/bin" ] || [ "$f" == "/root" ] || [ "$f" == "/dev" ] || [ "$f" == "/etc" ] || [ "$f" == "/sbin" ] || [ "$f" == "/home" ] || [ "$f" == "/mnt" ] || [ "$f" == "/sys" ] || [ "$f" == "/tmp" ] || [ "$f" == "/usr" ] || [ "$f" == "/var" ] || [ "$f" == "/proc" ];
then
int_v=1
else
int_v=0
fi
echo $f
done
if [ $int_v == 1 ];
then
echo "Cannot run it with the use of: */* or /* or /. "
else
echo "This script can run"
fi
Также в сценарий добавлен обходной путь:
Поскольку / *
является корневым каталогом; Я добавил оператор if для / bin, / root ...
Это работает, но проблема связана с * / *
.
Кто-нибудь имеет представление о том, как мы можем анализировать фактические переменные, используемые при запуске сценария, а не его вывод?
Когда вы запускаете сценарий из оболочки, оболочка расширяет символы подстановки перед запуском сценария (см. Расширение имени пути в man bash
). Итак, скрипт никогда не видит * / *
, он уже видит все развернутые файлы.
Чтобы передать выражение с подстановочными знаками буквально в скрипт, укажите его в кавычках или используйте обратную косую черту:
myscript.sh '*/*'
myscript.sh \*/\*
Вам необходимо правильно заключить в двойные кавычки все переменные, содержащие выражения с подстановочными знаками, если вы хотите предотвратить расширение подстановочных знаков, поскольку расширение переменных происходит раньше расширение пути (см. Расширение в man bash
).
a=* # No expansion, assignments are special.
echo $a # Expands the wildcard.
echo "$a" # Outputs *.