Как использовать канал в ссылке на переменную?

Вы можете попробовать это:

pkexec - Execute a command as another user

pkexec [--user username] PROGRAM [ARGUMENTS...]

0
25.07.2019, 17:11
2 ответа

Кажется, вы хотите удалить все, что находится после первой точки в именах, доступных в текущем каталоге.

Чтобы перебрать все имена в текущем каталоге, используйте

for name in *; do...; done

Использование вывода lsдля чего-либо, кроме визуального контроля, чревато ошибками, и его следует избегать. См. Почему *не *parse `ls`(и что делать вместо )?

Чтобы удалить бит после первой точки в $name(, включая саму точку ), используйте ${name%%.*}. Это расширение стандартного параметра , которое удаляет самый длинный суффикс, соответствующий шаблону подстановки .*, из значения переменной name.

Чтобы вывести результат этого расширения, вы можете использовать

printf '%s\n' "${name%%.*}"

См. оба Когда необходимо двойное -цитирование? и Почему printf лучше, чем echo? .

Ваш полный сценарий может быть написан

#!/bin/sh

for name in *; do
    printf '%s\n' "${name%%.*}"
done

Ваш второй вопрос, о том, что ${i}называется :Это расширение переменной (иногда используются термины "расширение параметра" или "подстановка переменной/параметра" ). ${i}будет расширено/заменено значением переменной i. Это также можно было бы написать $i, так как фигурные скобки здесь ничего особенного не делают. Единственное место, где вы можете захотеть использовать ${i}вместо $i, — это когда расширение является частью строки, а самый следующий символ допустим в имени переменной, как в"${i}_stuff"($i_stuffпопытается расширить переменную i_stuff).

1
28.01.2020, 02:29

Вы можете использовать ${i%%.*}. Он удалит все после первого появления точки, включая точку.

напр.

i=absdfsfd.b.c.dddd
echo "${i%%.*}"

выдаст вывод

absdfsfd

В вашем случае:

 for i in *;do echo "${i%%.*}";done

Не используйте for i in ls. См. Почему *не *parse `ls`(и что делать вместо )?

1
28.01.2020, 02:29

Теги

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