Просто в дополнение к тому, что сказали другие пользователи, фактический синтаксис составной команды if
:
if compound_list
then compound_list
[elif compound_list
then compound_list]...
[else compound_list]
fi
Где compound_list
— это, по сути, список любого количества команд. if
проверит код выхода последней команды первой COMPOUND_LIST
, чтобы решить, что выполнять (, then...
, одну из elif...; then...
илиelse...
).
Это означает, что вы можете переписать это так:
if foo "$1"; then
# Code to execute if foo returns 0
else
# Code to execute if foo returns 1
fi
Если foo
может возвращать множество других статусов (2
, 3
,..., 254
, 255
), то лучше использовать case
:
foo "$1"
case "$?" in
0) # Code to execute if foo returns 0 ;;
1) # Code to execute if foo returns 1 ;;
2) # Code to execute if foo returns 2 ;;
3) # Code to execute if foo returns 3 ;;
...
254) # Code to execute if foo returns 254 ;;
255) # Code to execute if foo returns 255 ;;
esac
is ";" after "$1" is defined in syntax?
Да, и, как заявил Кусалананда, он используется как разделитель команд.
POSIX определяет следующие команды:
[assignments] program [arguments] [redirections]
[!] command [pipe_operator command]...
pipeline [and-or_list_operator pipeline]...
and-or_list [compound_list_operator and-or_list]
( compound_list )
{ compound_list; }
for name [in words]; do compound_list; done
case word in [[(] patterns ) compound_list ;;]... esac
if compound_list; then compound_list; [elif compound_list; then compound_list;]... [else compound_list;] fi
while compound_list; do compound_list; done
until compound_list; do compound_list; done
name() compound_command [redirections]
compound_list_operator
может быть точкой с запятой или новой строкой и используется в контексте compound_list
/ for
/ case
/ if
/ while
/ until
.
Обратите внимание, что точка с запятой также требуется, когда в команде { compound_list; }
последняя команда compound_list
и закрывающая скобка }
находятся в одной строке.
Вы связываете все файлы в /path/to/STRBAM/*
и /path/to/New/
несколько раз, так как вы используете *
в исходном пути, а не {}
, т.е.:
awk 'NR > 1{ print $1 }' All.txt | xargs -I{} ln -s /path/to/STRBAM/{}.bam /path/to/New/
Если вы хотите добавить дополнительную проверку наличия символической ссылки в исходном каталоге, вы можете использовать небольшой сценарий оболочки и передать исходный код и каталог назначения в качестве первых двух позиционных параметров скрипта:
awk 'NR > 1{ print $1 }' All.txt | xargs sh -c '
src=$1; shift
dest=$1; shift
for i do
if [ -h "$src/${i}.bam" ]; then
ln -s "$src/${i}.bam" "$dest"
fi
done
' sh /path/to/STRBAM /path/to/New