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
Обратите внимание, как я завершаю команду в "$()". Это заставляет его выполнять и заменять свое место выходом. Цитаты важны, поэтому вывод не разбивается на несколько аргументов для [.
Следуя тому, что я считаю лучшим методом для bash, я бы рекомендовал сделать это вместо:
Это позволяет избежать специальной интерпретации $VAR1 эхом (в зависимости от содержимого, может быть ошибкой для опций) и вызова 2 ненужных исполняемых файлов, [ и echo. Что-то особенное, чтобы отметить здесь, что вам действительно не нужны никакие цитаты, которые я использовал. [[ является специальным синтаксисом bash, и даже если подстановка имела пробелы, bash не разбивал бы на слово. Это также не раскололо бы то, что было дано <<<. GHIJKLMN.csv не имеет пробелов или специальных символов, так что это тоже будет хорошо.
Вы также можете пропустить вызов cut, выполнив следующее:
if [[ "${VAR1:6:12}" = "GHIJKLMN.csv" ]]; then
Теперь все выполненный в bash без выполнения какой-либо другой программы. В этом синтаксисе вместо того, чтобы указывать диапазон символов, который вы хотите, как и на cut, вы предоставляете смещение 0 на первый символ и количество символов, которое вы хотите. Это 7 - 1, потому что индексы cut начинаются с 1 и 12, потому что диапазон 7-18 включен, поэтому 18 - 7 + 1.
Я только что увидел, ваш $VAR1 равен [ F25]. Поскольку вы сократили до конца, вам не нужно указывать счет:
if [[ "${VAR1:6}" = "GHIJKLMN.csv" ]]; then
В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt представляет собой составную команду, состоящую из двух простых команд: echo "hello" >&0, > file.txt, pipeed. Вторая команда пуста, поэтому bash просто открывает файл для записи, обрезает его и закрывает.
В терминале обычно подключаются стандартный вывод, вывод и ошибка. Поэтому, когда вы перенаправляете stdout на stdin, он все еще указывает на терминал, а вывод echo hello >&0 отображается в терминале и вообще не отправляется в канал.
В zsh пустая команда с перенаправлением по умолчанию имеет cat команду. Таким образом, echo "hello" >&0 | > file.txt эффективно echo "hello" >&0 | cat > file.txt, и вы увидите эффект, который вы хотите. Это невозможно в bash. Здесь вы увидите другую функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из перенаправленных адресатов (поэтому hello отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.
* Исключение составляет пустая команда с перенаправлением с перенаправленным stdin. В $(<some-file) bash будет читать содержимое some-file и использовать его как значение подстановки команды.
В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt представляет собой составную команду, состоящую из двух простых команд: echo "hello" >&0, > file.txt, pipeed. Вторая команда пуста, поэтому bash просто открывает файл для записи, обрезает его и закрывает.
В терминале обычно подключаются стандартный вывод, вывод и ошибка. Поэтому, когда вы перенаправляете stdout на stdin, он все еще указывает на терминал, а вывод echo hello >&0 отображается в терминале и вообще не отправляется в канал.
В zsh пустая команда с перенаправлением по умолчанию имеет cat команду. Таким образом, echo "hello" >&0 | > file.txt эффективно echo "hello" >&0 | cat > file.txt, и вы увидите эффект, который вы хотите. Это невозможно в bash. Здесь вы увидите другую функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из перенаправленных адресатов (поэтому hello отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.
* Исключение составляет пустая команда с перенаправлением с перенаправленным stdin. В $(<some-file) bash будет читать содержимое some-file и использовать его как значение подстановки команды.
В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt представляет собой составную команду, состоящую из двух простых команд: echo "hello" >&0, > file.txt, pipeed. Вторая команда пуста, поэтому bash просто открывает файл для записи, обрезает его и закрывает.
В терминале обычно подключаются стандартный вывод, вывод и ошибка. Поэтому, когда вы перенаправляете stdout на stdin, он все еще указывает на терминал, а вывод echo hello >&0 отображается в терминале и вообще не отправляется в канал.
В zsh пустая команда с перенаправлением по умолчанию имеет cat команду. Таким образом, echo "hello" >&0 | > file.txt эффективно echo "hello" >&0 | cat > file.txt, и вы увидите эффект, который вы хотите. Это невозможно в bash. Здесь вы увидите другую функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из перенаправленных адресатов (поэтому hello отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.
* Исключение составляет пустая команда с перенаправлением с перенаправленным stdin. В $(<some-file) bash будет читать содержимое some-file и использовать его как значение подстановки команды.
А я понимаю, о чем вы думали (я думаю). Вы пытались
echo hello | > file
, и ничего не случилось с file, поэтому вы подумали, может быть, мне нужно вывести вывод моей команды в stdin путем перенаправления:
echo hello >&0
Но поворот stdout в stdin - это именно то, что делает труба. Он принимает stdout и передает его команде справа от stdin. Если вы перенаправляете stdout, ничто не пройдет через трубу:
$ echo hello >&0 | cat > file
hello
$ cat file
$
(ничего там)
Но hello вышел в терминал, который читается с stdin, как обычно :
$ cat /dev/fd/0
hi
hi
I am talking to myself!
I am talking to myself!
и т. д. ...
Если мы не перенаправляем ...
$ echo hello | cat > file
$ cat file
hello
stdout of echo hello прошел (вместо терминала) и стал stdin cat.
Итак, труба делает то, что вы хотели сделать (поверните stdout в stdin и подключите его к правой команде), и вы
Что касается того, почему пустая команда с перенаправлением не делает то, что вы хотите, см. ответ muru.
Я предполагаю, что вы хотите записать вывод в файл и stdout.
echo hello > file.txt
делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee, как показано ниже:
echo hello | tee file.txt
Он выводит вывод echo на вход tee, а затем записывает тэ на экран и в file.txt.
Если вы просто хотите напечатать файл, используйте команду cat, как показано ниже:
echo hello | cat >file.txt
Также проверьте этот ответ, как работают перенаправления: https: //stackoverflow.com/a/818265/5771279
и это для того, как работает труба: https://stackoverflow.com/a/818265/5771279
8] Посмотрите также на man-страницу команды tee.$ echo "Hello" > file.txt
$ echo "World!" >> file.txt
$ cat file.txt
Hello
World!
$ cat file.txt | grep !
World!
Команда grep (глобальное регулярное выражение) ищет файл для заданной строки поиска и печатает строку, в которой он находится.
&>0 согласно Руководство для сценариев Advanced-Bash:
&>filename
# Redirect both stdout and stderr to file "filename."
# This operator is now functional, as of Bash 4, final release.
В вашем случае имя файла было 0, которое является стандартным вводом. Таким образом, он перенаправляет все выходные данные на вход. Который, насколько я могу судить, это круговая ссылка, которая не сработает. Используемый вами синтаксис - это >&0, который перенаправляет вывод на вход.
«filenames»:
Символ > предназначен для перенаправления файлов для запуска файла. 1] 1 стандартный вывод Символ >> предназначен для перенаправления файлов в конец файла (добавление).Традиционный способ использования файлового дескриптора 0 (стандартный ввод) через перенаправление файлов:
0< FILENAME
< FILENAME
# Accept input from a file.
# Companion command to ">", and often used in combination with it.
#
# grep search-word <filename
Если вы хотите использовать команду echo и | вместе (как указывает ответ Занны) вы можете использовать:
$ echo "hello" | cat > file.txt
$ cat file.txt
hello
Я предполагаю, что вы хотите записать вывод в файл и stdout.
echo hello > file.txt
делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee, как показано ниже:
echo hello | tee file.txt
Он выводит вывод echo на вход tee, а затем записывает тэ на экран и в file.txt.
Если вы просто хотите напечатать файл, используйте команду cat, как показано ниже:
echo hello | cat >file.txt
Также проверьте этот ответ, как работают перенаправления: https: //stackoverflow.com/a/818265/5771279
и это для того, как работает труба: https://stackoverflow.com/a/818265/5771279
Посмотрите также на man-страницу команды tee.
$ echo "Hello" > file.txt
$ echo "World!" >> file.txt
$ cat file.txt
Hello
World!
$ cat file.txt | grep !
World!
Команда grep (глобальное регулярное выражение) ищет файл для заданной строки поиска и печатает строку, в которой он находится.
&>0 согласно Руководство для сценариев Advanced-Bash:
&>filename
# Redirect both stdout and stderr to file "filename."
# This operator is now functional, as of Bash 4, final release.
В вашем случае имя файла было 0, которое является стандартным вводом. Таким образом, он перенаправляет все выходные данные на вход. Который, насколько я могу судить, это круговая ссылка, которая не сработает. Используемый вами синтаксис - это >&0, который перенаправляет вывод на вход.
«filenames»:
Символ > предназначен для перенаправления файлов для запуска файла. 1 стандартный вывод Символ >> предназначен для перенаправления файлов в конец файла (добавление).Традиционный способ использования файлового дескриптора 0 (стандартный ввод) через перенаправление файлов:
0< FILENAME
< FILENAME
# Accept input from a file.
# Companion command to ">", and often used in combination with it.
#
# grep search-word <filename
Если вы хотите использовать команду echo и | вместе (как указывает ответ Занны) вы можете использовать:
$ echo "hello" | cat > file.txt
$ cat file.txt
hello
А я понимаю, о чем вы думали (я думаю). Вы пытались
echo hello | > file
, и ничего не случилось с file, поэтому вы подумали, может быть, мне нужно вывести вывод моей команды в stdin путем перенаправления:
echo hello >&0
Но поворот stdout в stdin - это именно то, что делает труба. Он принимает stdout и передает его команде справа от stdin. Если вы перенаправляете stdout, ничто не пройдет через трубу:
$ echo hello >&0 | cat > file
hello
$ cat file
$
(ничего там)
Но hello вышел в терминал, который читается с stdin, как обычно :
$ cat /dev/fd/0
hi
hi
I am talking to myself!
I am talking to myself!
и т. д. ...
Если мы не перенаправляем ...
$ echo hello | cat > file
$ cat file
hello
stdout of echo hello прошел (вместо терминала) и стал stdin cat.
Итак, труба делает то, что вы хотели сделать (поверните stdout в stdin и подключите его к правой команде), и вы
Что касается того, почему пустая команда с перенаправлением не делает то, что вы хотите, см. ответ muru.
Я предполагаю, что вы хотите записать вывод в файл и stdout.
echo hello > file.txt
делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee, как показано ниже:
echo hello | tee file.txt
Он выводит вывод echo на вход tee, а затем записывает тэ на экран и в file.txt.
Если вы просто хотите напечатать файл, используйте команду cat, как показано ниже:
echo hello | cat >file.txt
Также проверьте этот ответ, как работают перенаправления: https: //stackoverflow.com/a/818265/5771279
и это для того, как работает труба: https://stackoverflow.com/a/818265/5771279
Посмотрите также на man-страницу команды tee.
$ echo "Hello" > file.txt
$ echo "World!" >> file.txt
$ cat file.txt
Hello
World!
$ cat file.txt | grep !
World!
Команда grep (глобальное регулярное выражение) ищет файл для заданной строки поиска и печатает строку, в которой он находится.
&>0 согласно Руководство для сценариев Advanced-Bash:
&>filename
# Redirect both stdout and stderr to file "filename."
# This operator is now functional, as of Bash 4, final release.
В вашем случае имя файла было 0, которое является стандартным вводом. Таким образом, он перенаправляет все выходные данные на вход. Который, насколько я могу судить, это круговая ссылка, которая не сработает. Используемый вами синтаксис - это >&0, который перенаправляет вывод на вход.
«filenames»:
Символ > предназначен для перенаправления файлов для запуска файла. 1 стандартный вывод Символ >> предназначен для перенаправления файлов в конец файла (добавление).Традиционный способ использования файлового дескриптора 0 (стандартный ввод) через перенаправление файлов:
0< FILENAME
< FILENAME
# Accept input from a file.
# Companion command to ">", and often used in combination with it.
#
# grep search-word <filename
Если вы хотите использовать команду echo и | вместе (как указывает ответ Занны) вы можете использовать:
$ echo "hello" | cat > file.txt
$ cat file.txt
hello
А я понимаю, о чем вы думали (я думаю). Вы пытались
echo hello | > file
, и ничего не случилось с file, поэтому вы подумали, может быть, мне нужно вывести вывод моей команды в stdin путем перенаправления:
echo hello >&0
Но поворот stdout в stdin - это именно то, что делает труба. Он принимает stdout и передает его команде справа от stdin. Если вы перенаправляете stdout, ничто не пройдет через трубу:
$ echo hello >&0 | cat > file
hello
$ cat file
$
(ничего там)
Но hello вышел в терминал, который читается с stdin, как обычно :
$ cat /dev/fd/0
hi
hi
I am talking to myself!
I am talking to myself!
и т. д. ...
Если мы не перенаправляем ...
$ echo hello | cat > file
$ cat file
hello
stdout of echo hello прошел (вместо терминала) и стал stdin cat.
Итак, труба делает то, что вы хотели сделать (поверните stdout в stdin и подключите его к правой команде), и вы
Что касается того, почему пустая команда с перенаправлением не делает то, что вы хотите, см. ответ muru.