标签: variable

shell 中导出变量的范围

假设我有一个脚本,我在其中导出了一个变量,如下所示:

#!/bin/bash
foo(){
    eval export one=1
}
foo1(){
    eval export two=2
}
(foo)
foo1
echo "one=$one"
echo "two=$two"
Run Code Online (Sandbox Code Playgroud)

但是我得到了以下输出:

root@centos1:~>/tmp/test.sh
one=
two=2 
Run Code Online (Sandbox Code Playgroud)

什么可能是我无法看到的价值$one和可以看到的原因$two

shell subshell variable

5
推荐指数
1
解决办法
6291
查看次数

为什么在没有变量的情况下直接使用它时条件不起作用?

这给了我一个错误,说参数太多:

if [ $( file -b $i ) == "directory" ]
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时

name=$( file -b $i )
if [ name == "directory" ]
Run Code Online (Sandbox Code Playgroud)

它似乎工作得很好。

有人可以解释这一点或在文档中指出解释吗?

bash command-substitution test variable

5
推荐指数
1
解决办法
366
查看次数

使用 zsh 将新值直接分配给数组中值的字符索引

如果我有一个字符串数组并且我想在一个值中更改单个字符,我可以这样做:

$ array=(hello world)
$ array[2]=${array[2]:0:2}X${array[2]:3}
$ echo $array[2]
woXld
Run Code Online (Sandbox Code Playgroud)

即使此解决方案有效,它对于很长的字符串也很慢,因为它实际上在索引处重新分配了值,并且必须在更改字符之前和之后扩展原始值的两侧。

虽然可以处理数组中单个值的字符索引:

$ echo ${array[2][3]}
X
Run Code Online (Sandbox Code Playgroud)

并将新值分配给标量变量的字符索引:

$ string='hello world'
$ string[9]=X
$ echo $string
hello woXld
Run Code Online (Sandbox Code Playgroud)

类似的语法不适用于数组:

$ array[2][3]=X
zsh: no matches found: array[2][3]=X
Run Code Online (Sandbox Code Playgroud)

有没有办法比第一种方法更快地做我想做的事?

zsh array shell-script variable

5
推荐指数
1
解决办法
264
查看次数

如何从两个或更一般的`n` 开始获取位置参数?

($@) 扩展到位置参数,从 1 开始。

我怎样才能得到位置参数,从两个或更一般的开始n

我想使用从两个开始的位置参数,作为命令的参数,例如,

myCommand $@
Run Code Online (Sandbox Code Playgroud)

shell array variable

5
推荐指数
2
解决办法
788
查看次数

如何在bash变量中保存psql错误消息输出?

我有一个运行多个不同 psql 语句的脚本。当输入的密码不正确时,我试图从 psql 捕获错误输出。检查前输入密码(正确后psql语句执行成功)

我尝试了以下方法:

pwcheck=`psql -q -U postgres -h $ip -d $database;`
echo "error message: $pwcheck"
Run Code Online (Sandbox Code Playgroud)

当我输入错误的密码进行检查时,会输出错误消息但变量为空。

psql: FATAL:  password authentication failed for user "postgres"
FATAL:  password authentication failed for user "postgres"
error message:
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想将错误消息保存到变量中,而不是打印我自己的错误消息/提示,也根本不显示 psql 错误。

如何将这些错误消息中的任何一个存储在 bash 变量中?

bash shell-script error-handling postgresql variable

5
推荐指数
1
解决办法
6514
查看次数

使用 Bash 将 XML 数据拆分为变量

我正在尝试从服务下载一些文件。这些文件位于 XML 文件中。XML 文件可以有一个文件或多个文件可供下载。但是,现在我的脚本有问题。我不知道如何将 XMLLINT 中的字符串拆分为数组,以便我可以单独下载每个文件。

我需要将字符串拆分为几个变量,然后下载 URL 字符串的每个文件。

但是文件 201701_1 不会重复,因此,我使用 curl 下载它们没有任何问题。但是文件coverage.zip 重复并且它们被curl 覆盖。我这样做:然后我做 curl 来下载单个文件。

curl -O -b cookie $URL 
Run Code Online (Sandbox Code Playgroud)

目前,我的脚本如下:

while read edition; do   XML="<?xml version=\"1.0\"
encoding=\"UTF-8\"?> <download-area>   <files>
    <file>
      <url>https://google.com/411/201701_01_01.zip</url>
    </file>
    <file>
      <url>https://google.com/411/201701_01_02.zip</url>
    </file>   </files> </download-area>
    "
    URL=$(echo $XML | xmllint --xpath \
    "/*[name()='download-area']/*[name()='files']/*[name()='file']/*[name()='url']/text()" -)

    echo "URL:: " $URL

done < $LATEST_EDITION
Run Code Online (Sandbox Code Playgroud)

LATEST_EDITION 只是一个带有行的文件。

我的问题是:如何将 VAR_1 和 VAR_2 拆分为多个 URL,以便我可以单独下载它们?如何防止coverage.zip 被覆盖?

scripting xml curl xmllint variable

5
推荐指数
1
解决办法
8190
查看次数

为什么我不能在 zsh 中定义一个名为 path 的只读变量?

在 zsh 中,path是一个特殊的数组变量,其内容与众所周知的PATH变量相关联。

如此特别,事实上,定义和调用函数

f() { local -r path=42 }
Run Code Online (Sandbox Code Playgroud)

导致错误f: read-only variable: path。如果局部变量被声明为可变的(即没有-r),一切都按预期工作。我无法使用其他变量名称重现此错误。

为什么会出现这个错误,是故意的吗?其他名称是否存在类似规则?

我在 macOS 10.12.6 上使用 zsh 5.2 (x86_64-apple-darwin16.0)。

shell zsh variable

5
推荐指数
1
解决办法
2128
查看次数

如何在`zsh`中增加动态命名的变量

假设在 中创建了一个动态命名的变量zsh,因此:

name="hello"
typeset $name=42
echo ${(P)${name}} # Prints the variable $hello, which is 42
Run Code Online (Sandbox Code Playgroud)

现在,假设一个人想要增加或更改所述变量,但不知道它的直接名称,即我希望类似于以下内容的工作:

(( ${(P)${name}} = ${(P)${name}} + 1 )) # Set $hello to 43?
Run Code Online (Sandbox Code Playgroud)

以上不起作用 - 什么会?

zsh variable

5
推荐指数
1
解决办法
4145
查看次数

转义变量中的双引号

我想将此命令放入稍后运行的文件中:

ln -s "$xr"/ya.txt ~
Run Code Online (Sandbox Code Playgroud)

我可以用(1)做到这一点:

cat > zu.sh <<eof
ln -s "$xr"/ya.txt ~
eof
Run Code Online (Sandbox Code Playgroud)

或(2):

printf 'ln -s "%s"/ya.txt ~\n' "$xr" > zu.sh
Run Code Online (Sandbox Code Playgroud)

或(3):

echo "ln -s '$xr'/ya.txt ~" > zu.sh
Run Code Online (Sandbox Code Playgroud)

或(4):

printf 'ln -s %q/ya.txt ~\n' "$xr" > zu.sh
Run Code Online (Sandbox Code Playgroud)

或 (5):

printf 'ln -s "%s"/ya.txt ~\n' "${xr//\"/\\\"}"
Run Code Online (Sandbox Code Playgroud)

然而,每个解决方案都是有问题的。如果 (1) 或 (2) 中的变量包含双引号,它们将失败;如果 (3) 中的变量包含单引号,则会失败。(4) 很好,但不是由 POSIX 定义的。(5) 是好的但是是 一种 Bashism。看起来最好的选择是使用 (1) 或 (2) 并转义变量中的任何双引号,但这可以用另一种方式完成吗?

shell posix quoting variable

5
推荐指数
1
解决办法
6276
查看次数

鱼壳中的一个字符串是否包含另一个字符串?

我的工作我的fish.config使用鱼贝

我正在尝试使用 bash 语法比较字符串,但 fish 不接受该语法。显然有另一种方法可以做到这一点。对于像下面的 bash 解决方案一样干净的解决方案有什么建议吗?

if [[ $STRING == *"other_string"* ]]; then
    echo "It contains the string!"
fi
Run Code Online (Sandbox Code Playgroud)

string fish variable

4
推荐指数
1
解决办法
1055
查看次数