Сравнить скрипт Bash и запустить команду - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть сценарий оболочки, который дает мне текстовый файл, содержащий определенные числа.Например, «48 347 345 221 1029 3943 1245 7899».Он содержит только одну строку.

Я хочу запустить другой сценарий оболочки, если одно из этих чисел превышает 500. Как можно сравнить числа и запустить сценарий оболочки?Заранее спасибо

cat text.txt | if [ awk '{print $1}' -ge 500 ] then command.sh fi 

Ответы [ 5 ]

0 голосов
/ 22 ноября 2018

Если вы не хотите конвертировать sring в числа, это станет неприятным.
Найдите число по крайней мере с 4 цифрами (сначала не 0) или число с 3 цифрами, первые 5 или вышевыдаст

# incorrect, includes 500 
grep -Eq "([1-9][0-9]|[5-9])[0-9][0-9]" text.txt && command.sh

Это также выполнит command.sh с номером 500.

# incorrect, will fail for 5000 and 1500
grep -E "([1-9][0-9]|[5-9])[0-9][0-9]" text.txt | grep -qv 500 && command.sh

Исправление становится слишком сложным.awk представляется наиболее естественным способом.
Искусственным способом преобразовывается ввод в строки с одним номером и добавляется дополнительная строка с рамкой:

(echo "500 border"; tr ' '  '\n' < text.txt) |
   sort -n |
   tail -1 | 
   grep -qv "border" && command.sh
0 голосов
/ 21 ноября 2018

Вы можете просто:

[[ "48 347 345 221 500" =~ ([ ][5-9][0-9][0-9]|[ ][1-9][0-9]{3,}) ]] && echo "Hi"
Hi
[[ "48 347 345 221" =~ ([ ][5-9][0-9][0-9]|[ ][1-9][0-9]{3,}) ]] && echo "Hi"

Надеюсь, это поможет!

0 голосов
/ 21 ноября 2018

Бросить содержимое файла в массив -

$: declare -a lst=( $(<text.txt) )

Затем запустить быстрый цикл.Если вы хотите выполнить команду для каждого удара,

$: for n in "${lst[@]}"
do (( n > 500 )) && echo "command.sh # $n > 500"
done
command.sh # 1029 > 500
command.sh # 3943 > 500
command.sh # 1245 > 500
command.sh # 7899 > 500

Если вы просто хотите быструю и грязную версию,

$: for n in $(<text.txt); do (( n > 500 )) && command.sh; done

Но я рекомендую вам потратить время на ужасные поступкисложные 2 шагов, LOL

Если вы хотите запустить его только один раз, если любое число превышает 500,

$: for n in "${lst[@]}"
do (( n > 500 )) && { echo "command.sh # $n > 500"; break; }
done
command.sh # 1029 > 500

И нене использовать кошку, как это.Старайтесь никогда не использовать кошку таким образом.

Если вам * ДЕЙСТВИТЕЛЬНО нужен файл в качестве ввода для if, то сделайте следующее:

if condition
then action
fi < text.txt 
0 голосов
/ 21 ноября 2018

Вы можете использовать простой цикл for следующим образом:

for n in $(cat test.txt)
do
    if [ $n -gt 500 ]; then
        something.sh
    fi
done
0 голосов
/ 21 ноября 2018

Используя awk, вы можете попробовать это:

awk '{for(i=1;i<=NF;i++)if($i > 500)exit 1}' text.txt || ./command.sh

command.sh будет выполнено, если команда awk завершится с ненулевым кодом из-за оператора ||.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...