标签: variable

57
推荐指数
2
解决办法
8万
查看次数

测试字符串是否包含子字符串

我有代码

file="JetConst_reco_allconst_4j2t.png"
if [[ $file == *_gen_* ]];
then
    echo "True"
else
    echo "False"
fi
Run Code Online (Sandbox Code Playgroud)

我测试是否file包含“gen”。输出为“假”。好的!

问题是当我用变量替换“gen”时testseq

file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file == *_$testseq_* ]];
then
    echo "True"
else
    echo "False"
fi
Run Code Online (Sandbox Code Playgroud)

现在输出为“真”。怎么会这样?如何解决问题?

string shell-script control-flow variable

48
推荐指数
4
解决办法
24万
查看次数

Shell 函数中局部变量的作用域

阅读24.2 后。局部变量,我认为var用关键字声明一个变量local意味着它var的值只能在由函数大括号分隔的代码块内访问。

但是,在运行以下示例后,我发现var也可以从该代码块调用的函数中访问、读取和写入 - 即即使var声明localouterFuncinnerFunc仍然能够读取它并更改其值。

Run It Online

#!/usr/bin/env bash

function innerFunc() {
    var='new value'
    echo "innerFunc:                   [var:${var}]"
}

function outerFunc() {
    local var='initial value'

    echo "outerFunc: before innerFunc: [var:${var}]"
    innerFunc
    echo "outerFunc: after  innerFunc: [var:${var}]"
}

echo "global:    before outerFunc: [var:${var}]"
outerFunc
echo "global:    after  outerFunc: [var:${var}]"
Run Code Online (Sandbox Code Playgroud)

输出:

global:    before outerFunc: [var:]               # as expected, `var` is not accessible outside of …
Run Code Online (Sandbox Code Playgroud)

shell bash shell-script function variable

47
推荐指数
3
解决办法
6万
查看次数

如何将字符串变量连接成第三个?

我需要在 bash 中连接两个字符串,以便:

string1=hello
string2=world

mystring=string1+string2
Run Code Online (Sandbox Code Playgroud)

echo mystring 应该产生

你好,世界

shell string variable

42
推荐指数
4
解决办法
37万
查看次数

如何将 bash 脚本的 cat 输出分配给另一个脚本中的变量

我有一个 bash 脚本,当它接受一个参数时会产生一个 cat 输出。我还有另一个 bash 脚本,它使用我想用来生成 cat 输出的参数来执行第一个 bash 脚本。如何将第一个 bash 脚本生成的 cat 输出存储在变量中?

shell-script cat variable

42
推荐指数
2
解决办法
16万
查看次数

如果引用变量为空,如何将其扩展为空?

说我有一个脚本在做:

some-command "$var1" "$var2" ...
Run Code Online (Sandbox Code Playgroud)

而且,如果var1为空,我宁愿将其替换为空字符串而不是空字符串,以便执行的命令是:

some-command "$var2" ...
Run Code Online (Sandbox Code Playgroud)

并不是:

some-command '' "$var2" ...
Run Code Online (Sandbox Code Playgroud)

有没有比测试变量并有条件地包含它更简单的方法?

if [ -n "$1" ]; then
    some-command "$var1" "$var2" ...
    # or some variant using arrays to build the command
    # args+=("$var1")
else
    some-command "$var2" ...
fi
Run Code Online (Sandbox Code Playgroud)

是否有参数替换可以在 bash、zsh 等中扩展为空?我可能仍然想在其余参数中使用通配符,因此禁用它并取消引用变量不是一种选择。

bash zsh shell-script variable

39
推荐指数
2
解决办法
7031
查看次数

如何在包含“”的字符串中插入变量?

我想通过插入变量来构造一个 xml 字符串:

str1="Hello"
str2="world"

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>'

echo $xml
Run Code Online (Sandbox Code Playgroud)

结果应该是

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Run Code Online (Sandbox Code Playgroud)

我也试过

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Run Code Online (Sandbox Code Playgroud)

但这会删除内部双引号并给出:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Run Code Online (Sandbox Code Playgroud)

shell bash xml variable

38
推荐指数
2
解决办法
12万
查看次数

转义变量以用作另一个脚本的内容

这个问题不是关于如何编写正确转义​​的字符串文字。我找不到任何与如何转义变量以在脚本或其他程序中直接使用的相关问题。

我的目标是使脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台机器上运行 0 到n次,并且生成它们的数据在运行(再次)之前可能会发生变化,因此直接通过网络执行操作将不行。

给定一个可能包含特殊字符(例如单引号)的已知变量,我需要将其写为完全转义的字符串文字,例如,foo包含的变量bar'baz应出现在生成的脚本中:

qux='bar'\''baz'
Run Code Online (Sandbox Code Playgroud)

这将通过附加"qux=$foo_esc"到其他脚本行来编写。我是这样使用 Perl 做到的:

foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
Run Code Online (Sandbox Code Playgroud)

但这似乎有点矫枉过正。

我单独使用 bash 没有成功。我已经尝试了这些的许多变体:

foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
Run Code Online (Sandbox Code Playgroud)

但是输出中会出现额外的斜杠(当我这样做时echo "$foo"),或者它们会导致语法错误(如果从 shell 完成,则需要进一步的输入)。

bash variable-substitution variable bash-expansion

38
推荐指数
5
解决办法
9万
查看次数

为什么打开文件比读取可变内容更快?

bash脚本中,我需要来自/proc/文件的各种值。到现在为止,我有几十行像这样直接 grep 文件:

grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

为了提高效率,我将文件内容保存在一个变量中并进行了搜索:

a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Run Code Online (Sandbox Code Playgroud)

而不是多次打开文件,这应该只打开一次并grep变量内容,我认为这会更快 - 但实际上它更慢:

grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

dash和也是如此zsh。我怀疑/proc/文件的特殊状态是一个原因,但是当我将 的内容复制/proc/meminfo到常规文件并使用它时,结果是相同的:

a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Run Code Online (Sandbox Code Playgroud)

使用 here 字符串来保存管道使其稍微快一点,但仍然不如文件快:

bash 4.4.19 $ time for i in {1..1000};do grep ^MemFree /proc/meminfo;done >/dev/null
real    0m0.803s
user    0m0.619s
sys     0m0.232s
bash 4.4.19 $ a=$(</proc/meminfo)
bash 4.4.19 $ time for i in {1..1000};do echo …
Run Code Online (Sandbox Code Playgroud)

shell bash zsh shell-script variable

36
推荐指数
2
解决办法
4784
查看次数

删除变量中的特定单词

bash脚本中,如何从字符串中删除单词,该单词将存储在变量中。

FOO="CATS DOGS FISH MICE"
WORDTOREMOVE="MICE"
Run Code Online (Sandbox Code Playgroud)

bash shell-script variable

35
推荐指数
3
解决办法
8万
查看次数