В сценарии удара у меня есть оператор "if". Тот оператор оценивает, если определенная часть строки (содержавшийся в переменной) равна другой строке. Я использую a cut
управляйте для изоляции строковой части, которую я хочу сравнить. Я попробовал немного различных вариантов, но это - то, которое я чувствую, должен работать. но это не делает:
Позволяет говорит это $VAR1 = "ABCDEFGHIJKLMN.csv"
if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then
..do stuff..
Только, чтобы быть уверенным я протестировал вывод "$VAR1"| cut -c 7-18
и это приводит к той же самой строке, с которой я сравниваю его.
Кто-либо понял, почему это не будет работать?
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
Это работает:
#!/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'