2017-01-28 10 views
0

У меня есть сценарий, который принимает один аргумент ($ 1). Поэтому я запускаю его так: bash script.sh file1.txt. Но когда я хочу заменить больше файлов (bash script.sh *), тогда он берет только один файл из всех. Как я могу заставить его работать? Должен ли быть другой скрипт, который заменяет все файлы из папки как $ 1 на script.sh или есть ли более простой способ?(Bash) Как заменить много файлов на скрипт?

#!/bin/bash 
sed -i '/^$/d' [email protected] 
declare -a command 
while read -r line 
do 
    [[ "$line" =~ ^secretcommand$ ]] || continue 
    read -r cmd || break 
    eval "$cmd" 
    break 
done<"[email protected]" 

Это не работает с «$ @».

Вы можете мне помочь?

+0

Использует ли '' $ @ "' в вашем скрипте выполнение того, что вы хотите? –

+0

Возможный дубликат [Как перебирать аргументы в сценарии Bash] (http://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-a-bash-script) – SLePort

+0

Вы также можете используйте 'shift'. Если ваши аргументы A B C, то $ 1 - «A», $ 2 - «B» и т. Д. После выполнения смены «A» исчезнет, ​​$ 1 будет «B» и так далее. – linuxfan

ответ

1

Цикл в вашем коде предназначен для повторения по всем строкам заданного файла. Вам нужно добавить внешний цикл для итерации по каждому файлу.

#!/bin/bash 
sed -i '/^$/d' "[email protected]" 
for file in "[email protected]" 
    while read -r line 
    do 
    [[ "$line" =~ ^secretcommand$ ]] || continue 
    read -r cmd || break 
    eval "$cmd" 
    break 
    done<"$file" 
done 

Пожалуйста, обратите внимание, что вам нужно процитировать «$ @» всякий раз, когда вы хотите использовать его в качестве списка аргументов для команды (например, ваш sed команды выше).

+0

Большое вам спасибо за помощь! Он работает правильно, когда я запускаю его следующим образом: «bash script.sh *», но когда я хочу использовать его таким образом: «sh script.sh *» Тогда мой вывод имеет некоторые проблемы и не работает много. Почему это? Какая разница в запуске скрипта как bash и sh? Я использовал этот скрипт для поиска в текстовом файле «secretcommand», а в следующей строке всегда есть команда, которую я хочу запустить в консоли. Я удалялся с sed пустыми строками, потому что иногда в моих файлах есть некоторые из этих пустых строк между ключевым словом и командой, а мой скрипт работает только тогда, когда команда правильная в следующей строке. – Anna

+0

Код, который я предложил, использует синтаксис, специфичный для bash (ваш вопрос помечен 'bash'). 'sh' может быть другой оболочкой, поэтому этот синтаксис не будет работать, если вы запустите' sh'. Включили ли вы первую строку (с '#!/Bin/bash') в вашем скрипте? – Fred

+0

Вы включили первую строку (с '#!/Bin/bash') в свой скрипт? Если это так, вы можете «chmod u + x» сценарий и запустить его, как если бы это была программа (правая оболочка будет использоваться автоматически). – Fred