在目录中找到可执行文件并通过bash将其赋值给变量

在目录中找到可执行文件并通过bash将其赋值给变量

我正在编写一些 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]/}"- 删除所有不属于athrough的字符z(在本例中,-从变量名中删除

declare "${variable}=${executable}"- 动态声明变量并设置其值。

相关内容