команда сокращения внутри, если оператор перестал работать

В сценарии удара у меня есть оператор "if". Тот оператор оценивает, если определенная часть строки (содержавшийся в переменной) равна другой строке. Я использую a cut управляйте для изоляции строковой части, которую я хочу сравнить. Я попробовал немного различных вариантов, но это - то, которое я чувствую, должен работать. но это не делает:

Позволяет говорит это $VAR1 = "ABCDEFGHIJKLMN.csv"

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then
..do stuff..

Только, чтобы быть уверенным я протестировал вывод "$VAR1"| cut -c 7-18 и это приводит к той же самой строке, с которой я сравниваю его.

Кто-либо понял, почему это не будет работать?

3
задан 6 March 2018 в 05:11

2 ответа

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then

То, что это делает, выполняются [ "$VAR1" и передайте вывод по каналу к cut -c 7-18 = "GHIJKLMN.csv" ]. [ перестанет работать, потому что это требует, чтобы его последний аргумент был ], и cut перестанет работать потому что, вероятно, ни один = ни ] файлы.

Я собираюсь предположить то, что Вы хотели, был:

if [ "$(echo "$VAR1" | cut -c 7-18)" = "GHIJKLMN.csv" ]; then

Заметьте, как я переношу команду в "$()". Это заставляет это выполнять и заменять своим местом с выводом. Кавычки важны, таким образом, вывод не разделяется на несколько аргументов в пользу [.

Следующее, чему я верю, чтобы быть лучшими практиками для удара, я рекомендовал бы делать это, вместо этого:

if [[ "$(cut -c 7-18 <<< "$VAR1")" = "GHIJKLMN.csv" ]]; then

Это избегает специальной интерпретации $VAR1 эхом (в зависимости от содержания, это могло бы принять его за опции), и вызов 2 бесполезных исполняемых файлов, [ и echo. Что-то специальное для замечания вот - то, что Вам действительно не нужна ни одна из кавычек, которые я использовал. [[ специальный синтаксис удара, и даже если замена имела пробелы, удар не был бы разделенный на слово это. Это также не разделило бы то, чему дали <<<. GHIJKLMN.csv не имеет никаких пробельных или специальных символов, таким образом, это было бы также прекрасно. Когда в сомнении, хотя, это - хорошая привычка заключить все в кавычки.

Вы, возможно, также пропустили вызов к cut путем выполнения этого:

if [[ "${VAR1:6:12}" = "GHIJKLMN.csv" ]]; then

Теперь, все сделано в ударе, не выполняя никакую другую программу. В этом синтаксисе вместо того, чтобы дать диапазон символов Вы хотите как Вы, сделал к cut, Вы предоставляете смещение на основе 0 первому символу и количеству символов, которые Вы хотите. Этому 7 лет - 1 потому что cutиндексы запускаются с 1, и 12, потому что диапазон 7-18 является содержащим, таким образом, 18 - 7 + 1.

Я просто видел, Ваш $VAR1 "ABCDEFGHIJKLMN.csv". Так как Вы сокращаете в конец, Вы не должны действительно указывать количество:

if [[ "${VAR1:6}" = "GHIJKLMN.csv" ]]; then
6
ответ дан 1 December 2019 в 13:15

Это работает:

#!/bin/bash

echo 'Beginning of script'
VAR1='ABCDEFGHIJKLMN.csv'
if [ $(echo "$VAR1" | cut -c 7-18) == "GHIJKLMN.csv" ]; then
    echo 'If condition triggered.'
fi
echo 'End of script'

Это также работает:

#!/bin/bash

echo 'Beginning of script'
VAR1='ABCDEFGHIJKLMN.csv'
VAR2=$(echo "$VAR1" | cut -c 7-18)
if [ "$VAR2" == "GHIJKLMN.csv" ]; then
    echo 'If condition triggered.'
fi
echo 'End of script'
2
ответ дан 1 December 2019 в 13:15

Другие вопросы по тегам:

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