Вы можете попробовать это:
pkexec - Execute a command as another user
pkexec [--user username] PROGRAM [ARGUMENTS...]
Кажется, вы хотите удалить все, что находится после первой точки в именах, доступных в текущем каталоге.
Чтобы перебрать все имена в текущем каталоге, используйте
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
).
Вы можете использовать ${i%%.*}
. Он удалит все после первого появления точки, включая точку.
напр.
i=absdfsfd.b.c.dddd
echo "${i%%.*}"
выдаст вывод
absdfsfd
В вашем случае:
for i in *;do echo "${i%%.*}";done
Не используйте for i in ls
. См. Почему *не *parse `ls`(и что делать вместо )?