标签: variable

如果已经执行,如何绕过函数?

我有一个函数prereq()可能会被调用多次,但实际上不应通过从菜单中选择其他选项(菜单上的每个选项都作为代码的一部分)在脚本的同一运行线程上执行多次prereq()

# Pre-requirements
prereq ()
{
        echo
        echo "########################## CHECKING PRE-REQUIREMENTS ##########################"
        echo "#                                                                             #"
        echo "Required packages: hdparm, fio, sysbench, iperf3 and sshpass"
        sleep 2
        echo
        for pack in hdparm fio sysbench iperf3 sshpass; do
                echo "Checking and if needed install '$pack'..."
                if ! rpm -qa | grep -qw "$pack"; then
                        yum install -y $pack > /dev/null
                else
                        echo "$pack is already installed, skipping..."
                        echo
                fi
        done
        echo "###############################################################################"
echo
}
Run Code Online (Sandbox Code Playgroud)

该函数执行如下:

select …
Run Code Online (Sandbox Code Playgroud)

shell-script variable

7
推荐指数
2
解决办法
746
查看次数

如何获取一些 shell 代码而不是文件?

有一个source命令的描述:

source是一个 bash shell 内置命令,它在当前 shell 中执行作为参数传递的文件的内容。它有一个同义词.(句号)。

例如,为了进行实验,我想zsh在我的例子中从不同的 shell 导出一个变量(在 中运行命令bash):

$ zsh -c "export test=$(echo "hello world")"
$ echo $test

$
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为该命令在zsh子 shell 中运行,并且不是直接在bash.

如果我以这种方式创建并获取脚本:

#!/home/linuxbrew/.linuxbrew/bin/zsh

export test=$(echo "hello world")
Run Code Online (Sandbox Code Playgroud)
$ chmod 777 test.zsh
$ source test.zsh
$ echo $test
hello world
Run Code Online (Sandbox Code Playgroud)

工作正常。

问题是如何在source不使用脚本的情况下执行命令,因为source只能使用文件运行?我想实现这样的目标:

source zsh -c "export test=$(echo "hello world")"
Run Code Online (Sandbox Code Playgroud)

如果不可能,请解释原因。

bash source zsh variable

7
推荐指数
1
解决办法
2087
查看次数

使用 POSIX 参数扩展从变量中删除重复的字符串模式

我想使用2.6.2 参数扩展从字符串中删除前导字符,但惊讶地发现“删除最大前缀模式”不会自动重复该模式。

$ x=aaaaabc
$ printf %s\\n "${x##a}"
aaaabc
Run Code Online (Sandbox Code Playgroud)

如您所见,只有第一个a已被删除。预期输出为、、或中bc的任何一个。x=bcx=abcx=aabcx=aaabcx=aaaabc

a如果我想从 的开头删除尽可能多的内容,我正在努力弄清楚如何编写该模式$x。我也没有运气搜索其他线程,因为许多答案都使用 bash,但我正在寻找 POSIX shell 解决方案。

scripting parameter shell-script posix variable

7
推荐指数
3
解决办法
592
查看次数

变量未在另一个变量 bash 内扩展

我正在 bash 脚本中读取一个 csv 文件,如下所示:

resource='/data/bscs/'
while IFS='|'read seqid fname fpath 
do
    echo "FILENO:         $seqid"
    echo "FILENAME:       $fname"
    echo "FILE_PATH:    $fpath"                    
done < "report.csv"
Run Code Online (Sandbox Code Playgroud)

我的 csv 文件具有以下值:

3|sample1.txt|$资源/操作/

我希望 $resource 在 $fname 内扩展。相反,我得到了这个输出:

FILENO:         3
FILENAME:       sample1.txt
SOURCE PATH:    $resource/operation
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

"${fpath}" $(echo $fpath)

我怎样才能做到这一点?

bash shell-script variable-substitution variable

6
推荐指数
1
解决办法
2万
查看次数

在单个变量中保存包含参数的多个空格?

我正在尝试调试我的 shell 脚本:

content_type='-H "Content-Type: application/json"'
curl $content_type -d "{"test": "test"}" example.com
Run Code Online (Sandbox Code Playgroud)

我了解到这并没有达到我的预期。在此脚本中,传递给curl(由于$content_type)的参数是:

  1. -H
  2. "Content-Type:
  3. application/json"

而不是(我所期望的):

  1. -H
  2. Content-Type: application/json

我知道我可以编写如下脚本:

content_type="Content-Type: application/json"
curl -H "$content_type" -d "{"test": "test"}" example.com
Run Code Online (Sandbox Code Playgroud)

它会以这种方式工作,但我想知道是否可以在单个变量中保存包含参数的多个空间。

对于第二个(工作)版本,如果我想排除内容类型,我需要删除两件事:-H$content_type

但是,我想知道是否可以将选项及其值放入单个实体中,以便排除/包含内容类型将导致删除/添加单个实体。

使用数组是不可移植的,因为 POSIX 中没有数组。

为什么第一个方法会这样?

原因是分词。当我们定义content_type如下时:

content_type='-H "Content-Type: application/json"'
Run Code Online (Sandbox Code Playgroud)

它具有以下价值:

-H "Content-Type: application/json"
Run Code Online (Sandbox Code Playgroud)

当我们引用不带引号的变量(即,$content_type而不是"$content_type")时,扩展值将成为分词的主题。来自bash 手册的分词页面:

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。

来自同一页面:

shell 将 的每个字符视为$IFS分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词。如果 IFS 未设置,或其值恰好为 <space><tab><newline>,则默认...

因此,-H "Content-Type: application/json" …

shell shell-script variable

6
推荐指数
1
解决办法
1822
查看次数

Bash:使用 tee 的 for 循环中的变量范围

考虑:

numbers="1 111 5 23 56 211 63"
max=0

for num in ${numbers[@]}; do

      [ $num -gt $max ]\
           && echo "old -> new max = $max -> $num"\
           && max=$num

done | tee logfile

echo "Max= $max"
Run Code Online (Sandbox Code Playgroud)

如果我删除| tee logfilemax 变量正确打印为 211,但如果我将它留在我得到Max= 0.

到底是怎么回事?

shell bash pipe tee variable

6
推荐指数
2
解决办法
4474
查看次数

用 printf 重复变量

如果我使用以下命令:

printf "%.0s?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?\n" {1..3}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
Run Code Online (Sandbox Code Playgroud)

如何通过从变量中获取重复字符来获得相同的结果?

我试过这种方法:

var="?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?"
printf '%.0s%s\n' {1..3} "$var"
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我最终得到了这个:

2
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
Run Code Online (Sandbox Code Playgroud)

bash shell-script printf variable

6
推荐指数
1
解决办法
1411
查看次数

bash - 如果字符串的长度为(非)零,则为真?

# touch $$
# gzip $$
# gzip --test $$.gz
# echo $?
0
# OUT=$(gzip --test $$.gz)
# echo $OUT

# if [ -z $OUT ] ; then echo $$ ; fi
26521
# if [ -n $OUT ] ; then echo $$ ; fi
26521
# 
Run Code Online (Sandbox Code Playgroud)

bash(1)

   -z string
          True if the length of string is zero.
   string
   -n string
          True if the length of string is non-zero.
Run Code Online (Sandbox Code Playgroud)

我很困惑,它如何同时为零非零?如何检查键是否具有值(使用bash)?

string shell-script test variable

6
推荐指数
2
解决办法
1万
查看次数

回显以“nlu_setting”开头的所有环境变量的名称和值

我正在寻找一种方法来回显以 nlu_setting 开头的所有环境变量的名称和值,因此输出可能如下所示:

nlu_setting_json=true
nlu_setting_global=0
nlu_setting_bar=foo
Run Code Online (Sandbox Code Playgroud)

有谁知道如何做到这一点?

shell bash environment-variables variable

6
推荐指数
1
解决办法
5243
查看次数

将变量设置为数组中的随机项时如何指定机会?

目前我这样做是为了将变量设置为数组中的随机项:

array=("foo" "bar" "baz")

var=${array[$RANDOM % ${#array[@]} ]}
Run Code Online (Sandbox Code Playgroud)

如果我想设置$var为这些值之一,但指定变量将分别设置为每个项目的值的机会,我该怎么办?假设我想要 73.3% 的机会foo,26.6% 的机会bar,以及 0.1% 的机会baz

command-line array random variable

6
推荐指数
2
解决办法
376
查看次数