Я пишу сценарій в UNIX, де я повинен перевірити, чи є перший символ у рядку "/", а якщо він - гілка.
Наприклад, у мене є рядок:
/some/directory/file
Я хочу, щоб це повернуло 1, і:
server@10.200.200.20:/some/directory/file
повернути 0.
Я пишу сценарій в UNIX, де я повинен перевірити, чи є перший символ у рядку "/", а якщо він - гілка.
Наприклад, у мене є рядок:
/some/directory/file
Я хочу, щоб це повернуло 1, і:
server@10.200.200.20:/some/directory/file
повернути 0.
Відповіді:
Для цього існує багато способів. Ви можете використовувати символи підстановки у подвійних дужках:
str="/some/directory/file"
if [[ $str == /* ]]; then echo 1; else echo 0; fi
Ви можете використовувати розширення підрядків:
if [[ ${str:0:1} == "/" ]] ; then echo 1; else echo 0; fi
Або регулярний вираз:
if [[ $str =~ ^/ ]]; then echo 1; else echo 0; fi
${str::1}.
Розглянемо також заяву case, яка сумісна з більшістю оболонок на основі sh:
case $str in
/*)
echo 1
;;
*)
echo 0
;;
esac
*відповідає лише одному компоненту шляху, ніколи не через косу риску/
#вам доведеться використовувати лапки. Наприклад: '#'*) echo "found comment";;.
$ foo="/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
1
$ foo="server@10.200.200.20:/some/directory/file"
$ [ ${foo:0:1} == "/" ] && echo 1 || echo 0
0
foo='*'; [ ${foo:0:1} == "/" ] && echo 1 || echo 0збирається вивести цю помилку bash: [: too many arguments. Використовуйте [ "${foo:0:1}" == "/" ] && echo 1 || echo 0або навіть краще[[ ${foo:0:1} == "/" ]] && echo 1 || echo 0
cut -c1
Це POSIX, і на відміну від caseнасправді витягує перший символ, якщо він вам потрібен пізніше:
myvar=abc
first_char="$(printf '%s' "$myvar" | cut -c1)"
if [ "$first_char" = a ]; then
echo 'starts with a'
else
echo 'does not start with a'
fi
awk substr є ще однією POSIX, але менш ефективною альтернативою:
printf '%s' "$myvar" | awk '{print substr ($0, 0, 1)}'
printf '%s'полягає у тому, щоб уникнути проблем із символами втечі: https://stackoverflow.com/a/40423558/895245 наприклад:
myvar='\n'
printf '%s' "$myvar" | cut -c1
результати, \як очікувалося.
${::} схоже не POSIX.
Дивіться також: Як витягти перші два символи рядка в сценаріях оболонки?
printf? Це було б тому, echoщо прибирало пробіли?
echoмає реалізації визначається поведінка на пагонах я думаю: stackoverflow.com/questions/8467424 / ...