Назад | Перейти на главную страницу

Как мне выполнить синтаксический анализ / * или * / * в сценарии оболочки bash

Я пытаюсь написать сценарий, который позволит мне получить аргументы при запуске сценария. Я могу сделать это с помощью $ @ в скрипте. Но если я запустил сценарий с /* или */* он дает список всех каталогов в /* или */*.

То, что я хочу получить в качестве переменной в скрипте, - это значение /* и */* если используется; вместо всех каталогов и файлов в /*при каждом запуске скрипта.

Я знаю, что проблема в том, как 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 *.