我正在编写一些 bash 脚本,需要一些帮助才能在目录中找到可执行文件并将其分配给变量。
所以我知道如果我运行:
ls -dF `find . -maxdepth 1 \( -perm -1 -o \( -perm -10 -o -perm -100 \) \) -print`
它将返回如下内容:
./ravend
./raven-cli
我想做的是让它返回:
ravend
raven-cli
然后有类似的东西:
coind='ravend' coincli='raven-cli'
我假设我必须做一些类似这个代码示例的事情,但我只是不知道如何编写它
output=$(ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'); echo $output
答案1
我认为,采取一些通用方法获取多个结果,然后将结果的一部分用于特定事物并不是一个好主意。我建议对每个变量进行更有针对性的搜索。
抛开这一点,我很高兴想出了以下解决方案:
#!/usr/bin/env bash
main() {
local coind coincli
read -a executables -r < <(find . -maxdepth 1 -type f \( -perm -1 -o \( -perm -10 -o -perm -100 \) \) -printf "%f ")
(( "${#executables[@]}" > 2 )) && { echo "Found more than 2 executables: ${executables[*]}"; return 1; }
local word
word="$(comm -12 --nocheck-order <(grep -o . <<<"${executables[0]}") <(grep -o . <<<"${executables[1]}") | awk '{printf $0}')"
for executable in "${executables[@]}"; do
local variable="${executable/${word}/coin}"
variable="${variable//[^a-z]/}"
declare "${variable}=${executable}"
done
echo "coind: ${coind}"
echo "coincli: ${coincli}"
}
main "$@"
exit $?
find . -maxdepth 1 -type f \( -perm -1 -o \( -perm -10 -o -perm -100 \) \) -printf "%f "
- 在当前目录中查找具有可执行权限的文件,并且只打印文件名(不打印路径)
comm -12 --nocheck-order <(grep -o . <<<"${executables[0]}") <(grep -o . <<<"${executables[1]}")
- 查找两个可执行文件名称中都存在的单词/字符
grep -o . <<<"${executables[0]}"
- 将字符串拆分为每行 1 个字符(对两个可执行文件均如此)
| awk '{printf $0}')
- 每个字符都打印在新的一行上,用于将其折叠成一个单词
variable="${executable/${word}/coin}"
- 将常用词替换为coin
(稍后将用于设置变量)
variable="${variable//[^a-z]/}"
- 删除所有不属于a
through的字符z
(在本例中,-
从变量名中删除
declare "${variable}=${executable}"
- 动态声明变量并设置其值。