Проблема в сценарии оболочки с заменой явной строки переменной - PullRequest
1 голос
/ 23 декабря 2019

Я использовал сценарий оболочки, который делал что-то вроде этого:

output=$(ls -R /logs/{abc,cde}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" )
echo $output

При запуске этой команды я обычно получал файлы с abc или cde в соответствующем месте. Вы можете игнорировать другие переменные, такие как дата и т. Д.

Однако, когда я изменил скрипт, приняв abc, cde в качестве параметра командной строки вместо жесткого кодирования в скрипте, он перестал работать. Я изменил команду на:

output=$(ls -R /logs/{${list}}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" )

, где список равен abc,cde

Я пробовал много разных комбинаций кавычек и т. Д., Но, похоже, это не работает. Может кто-нибудь помочь, пожалуйста, с правильным синтаксисом, что он работает правильно

Ответы [ 2 ]

1 голос
/ 23 декабря 2019

Попробуйте с этим

  1. Присвойте abc и cde массиву ex - объявите -a ARR = (abc cde)

  2. Назначьте егок переменной, как показано ниже.

    выход = ls -R /logs/${ARR[@]/"$((${date}/100))"/*/out*${date}* | grep -v "Random"

1 голос
/ 23 декабря 2019

Это не работает, потому что порядок расширения препятствует этому.

Порядок расширений: скобка расширения;Расширение тильды, расширение параметров и переменных

Вы можете решить эту проблему с помощью eval, но eval вообще следует избегать.

Возможно, лучше использовать findздесь.

find /logs -name 'abc/...' -o -name 'cde/...' 

Это работает даже с переменными

Или используйте логику регулярных выражений.

find /logs/ -regex '/logs/\(abc\|cde\).*'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...