Как мне разобрать / * или * / * в сценарии оболочки 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 ... Это работает, но проблема связана с * / * .

Кто-нибудь имеет представление о том, как мы можем анализировать фактические переменные, используемые при запуске сценария, а не его вывод?

1
задан 24 April 2020 в 10:27
1 ответ

Когда вы запускаете сценарий из оболочки, оболочка расширяет символы подстановки перед запуском сценария (см. Расширение имени пути в man bash ). Итак, скрипт никогда не видит * / * , он уже видит все развернутые файлы.

Чтобы передать выражение с подстановочными знаками буквально в скрипт, укажите его в кавычках или используйте обратную косую черту:

myscript.sh '*/*'
myscript.sh \*/\*

Вам необходимо правильно заключить в двойные кавычки все переменные, содержащие выражения с подстановочными знаками, если вы хотите предотвратить расширение подстановочных знаков, поскольку расширение переменных происходит раньше расширение пути (см. Расширение в man bash ).

a=*        # No expansion, assignments are special.
echo $a    # Expands the wildcard.
echo "$a"  # Outputs *.
2
ответ дан 23 April 2020 в 13:44

Теги

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