awk -F"[<>]" '/longitude/{long=$3}/latitude/{print $3","long}' file.txt
/bin/sh
будет только оболочкой POSIX, а оболочка POSIX не знает о подстроках в расширениях параметров .
POSIX «определяет стандартный интерфейс и среду операционной системы, включая интерпретатор команд (или «оболочку» )», и является стандартом, которому в основном следуют в традиционных средах стиля Unix -.См. Что такое POSIX? для более подробного описания. В средах, вдохновленных POSIX -, /bin/sh
должен предоставлять оболочку в стиле POSIX -, а в сценарии, использующем /bin/sh
в качестве своего шебанга, вы можете полагаться только на функции POSIX (, хотя большинство реальных реализаций из /bin/sh
предоставить больше ). Совершенно нормально полагаться на более продвинутую оболочку, но shebang необходимо соответствующим образом скорректировать.
Поскольку ваш скрипт использует функцию bash, правильным шебангом будет#!/bin/bash
(или, возможно, #!/usr/bin/env bash
), независимо от среды, в которой он будет работать. В некоторых случаях он может работать с #!/bin/sh
, но это просто счастливый случай.
Ваш скрипт использует не -POSIX-расширение для расширения параметров, поэтому он не будет работать в большинстве оболочек.
Это может быть решено либо путем принудительного выполнения сценария такой оболочкой, как bash
, либо написанием сценария оболочки POSIX , что во многих случаях является хорошей привычкой.
К сожалению, нет элегантного способа получить первый символ в параметре, как в zsh
с помощью $1[1]
. Таким образом, можно использовать
"$(echo "$1" | cut -c1-1)"
или "$(printf %.1s "$1")"
или "${1%"${1#?}"}"
, который удаляет строку без первого символа(${1#?}
)из строки