Как написать сценарий оболочки для вывода двух переменных в одной строке без цикла

Если ваш findподдерживает -lnameили-ilname(расширения GNU, которые также поддерживаются некоторыми BSD (, включая macOS , которые, согласно вашему /Volumes, вы можете использовать )).

find. -lname '*Dropbox*' -exec ls -ld {} +

Или дело -бесчувственно:

find. -ilname '*dropbox*' -exec ls -ld {} +

Если нет (или даже если да, если вы хотите легко что-то сделать с этими ссылками или предпочитаете отсортированный список )и у вас есть zsh(, поставляемый по умолчанию в macOS ), вы можете сделать:

zmodload zsh/stat
set -o extendedglob # for (#i) for case insensitive
link_match() {
  local target
  zstat -A target +link -- "${2-$REPLY}" &&
    [[ $target = $~1 ]]
}
ls -ld -- **/*(D@e:'link_match "(#i)*dropbox*"':)

Или воссоздать ссылки:

zmodload zsh/stat
for l (**/*(D@))
  zstat -A target +link -- $l &&
    [[ $target = *"Dropbox (Personal)"* ]] &&
    rm -f -- $l &&
    ln -s -- ${target//" (Personal)"} $l

Заметьте, что при необходимости любой шелл-код всегда можно записать в одну строку, но я не вижу в этом смысла. Здесь просто соедините эти строки вместе, если хотите, чтобы они были в одной строке.

Сделать что-то подобное с bashи утилитами GNU или FreeBSD/macOS сложнее и будет менее эффективно:

LC_ALL=C find. -lname '*Dropbox (Personal)*' -exec bash -c '
  for l do
    target=$(readlink "$l" && echo.) || continue
    target=${target%??}
    rm -f "$l" &&
      ln -s -- "${target//" (Personal)"}" "$l"
  done' bash {} +

-1
08.01.2020, 09:22
2 ответа

Обычно вы используете printfдля вывода данных переменных, например:

#!/bin/sh

src=192.168.1.1
port=22

printf '%s,%s\n' "$src" "$port"

Вам также может показаться интересным следующее, касающееся цитирования:


Как вариант,

#!/bin/sh

src=192.168.1.1
port=22

string="$src,$port"

printf '%s\n' "$string"

Единственная разница здесь в том, что я создал новую переменную с разделенными запятыми -значениями двух первых переменных, а затем вывел ее. Это может быть то, что вы хотите, в зависимости от того, как вы будете использовать эту строку позже в сценарии.

1
28.01.2020, 05:07

Чтобы отобразить любое количество переменных, просто укажите их в одной и той же команде echo. Также обратите внимание, что в правильном синтаксисе оболочки для присваиваний не должно быть пробелов вокруг =.

#!/bin/sh
SRC="192.168.1.1"
PORT="22"
echo "$SRC,$PORT"

Результатом запуска скрипта будет:

 $./test.sh
 192.168.1.1,22
2
28.01.2020, 05:07

Теги

Похожие вопросы