Я обнаружил, что -e
флаг элегантный и прямой
STR="Hello\nWorld"
echo -e $STR
#outputs
Hello
World
Если строка является результатом другой команды, я просто использую кавычки
indexes_diff=$(git diff index.yaml)
echo "$indexes_diff"
<глоток> Ранее, ответ был представлен с тем, что является теперь первым разделом как последним разделом. глоток>
!
Ввод по абсолютному адресу оператора вокруг спецификации оболочки для других проблем, я недавно (сентябрь 2015) заметил, что оболочка POSIX поддерживает !
оператор. Например, это перечислено как зарезервированное слово и может появиться в начале конвейер —, где простая команда является особым случаем 'конвейера'. Это может, поэтому, использоваться в if
операторы и while
или until
циклы также — в совместимых POSIX оболочках. Следовательно, несмотря на мое резервирование, это, вероятно, более широко доступно, чем я понял назад в 2008. Быстрая проверка POSIX, 2004 и SUS/POSIX 1997 показывают, что !
присутствовал в обеих тех версиях.
Примечание, что !
оператор должен появиться в начало из конвейера и инвертирует код статуса всего конвейера (т.е. последний команда). Вот некоторые примеры.
# Simple commands, pipes, and redirects work fine.
$ ! some-command succeed; echo $?
1
$ ! some-command fail | some-other-command fail; echo $?
0
$ ! some-command < succeed.txt; echo $?
1
# Environment variables also work, but must come after the !.
$ ! RESULT=fail some-command; echo $?
0
# A more complex example.
$ if ! some-command < input.txt | grep Success > /dev/null; then echo 'Failure!'; recover-command; mv input.txt input-failed.txt; fi
Failure!
$ ls *.txt
input-failed.txt
В Границе (Korn, POSIX, Bash) сценарий, я использую:
if ...command and arguments...
then : it succeeded
else : it failed
fi
Это столь портативно, как это добирается. 'Команда и аргументы' могут быть конвейером или другой составной последовательностью команд.
not
команда '!' оператор, ли встроенный к Вашей оболочке или обеспеченный o/s, не универсально доступен. Не ужасно трудно записать, хотя - код ниже относится ко времени, по крайней мере, 1991 (хотя я думаю, что записал предыдущую версию еще дольше назад). Я не склонен использовать это в своих сценариях, тем не менее, потому что это не надежно доступно.
/*
@(#)File: $RCSfile: not.c,v $
@(#)Version: $Revision: 4.2 $
@(#)Last changed: $Date: 2005/06/22 19:44:07 $
@(#)Purpose: Invert success/failure status of command
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 1991,1997,2005
*/
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "stderr.h"
#ifndef lint
static const char sccs[] = "@(#)$Id: not.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
#endif
int main(int argc, char **argv)
{
int pid;
int corpse;
int status;
err_setarg0(argv[0]);
if (argc <= 1)
{
/* Nothing to execute. Nothing executed successfully. */
/* Inverted exit condition is non-zero */
exit(1);
}
if ((pid = fork()) < 0)
err_syserr("failed to fork\n");
if (pid == 0)
{
/* Child: execute command using PATH etc. */
execvp(argv[1], &argv[1]);
err_syserr("failed to execute command %s\n", argv[1]);
/* NOTREACHED */
}
/* Parent */
while ((corpse = wait(&status)) > 0)
{
if (corpse == pid)
{
/* Status contains exit status of child. */
/* If exit status of child is zero, it succeeded, and we should
exit with a non-zero status */
/* If exit status of child is non-zero, if failed and we should
exit with zero status */
exit(status == 0);
/* NOTREACHED */
}
}
/* Failed to receive notification of child's death -- assume it failed */
return (0);
}
Это возвращает 'успех', противоположность отказа, когда этому не удается выполнить команду. Мы можем дебатировать, не делают ли 'ничего успешно' опция, было корректно; возможно, это должно сообщить об ошибке, когда не просят сделать что-либо. Код в' "stderr.h"
' предоставляет простые услуги сообщения об ошибке - я использую его везде. Исходный код по запросу - видит мою страницу профиля для контакта со мной.
В Bash используйте! оператор перед командой. Например:
! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist"
Вы могли попробовать:
ls nonexistingpath || echo "yes, nonexistingpath doesn't exist."
или просто:
! ls nonexistingpath
! ls nonexistingpath && echo "yes, nonexistingpath doesn't exist."
или
ls nonexistingpath || echo "yes, nonexistingpath doesn't exist."