Я пишу сценарій в 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 / ...