标签: variable

对多个命令重复使用相似的标志

假设我想执行多个具有类似标志的命令,例如:

du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
Run Code Online (Sandbox Code Playgroud)

我想重用标志序列--exclude并使代码更干净,例如将这些标志保存到变量中。

所以之后上面的命令看起来像

du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
Run Code Online (Sandbox Code Playgroud)

请注意,tar排除相对于给定目录的文件和目录。

最好、最干净的解决方案是什么?

背景

我想使用 tar 备份我的系统并排除一些我不需要的目录。

shell bash variable

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

如何只打印 shell 脚本中定义的变量?

让我们假设一些 bash shell 脚本,例如:

#!/bin/bash 
a=3
b=7
set -o posix
set
Run Code Online (Sandbox Code Playgroud)

在这种情况下,执行变量set或其他一些打印环境变量的命令(envdeclare...等)输出 myab变量,以及环境中的许多变量PATH(和函数)( ,PWDTEMP...等) )。

有没有办法只打印脚本主体中定义的变量?

shell scripting variable

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

传递参数以在孙进程中使用

我有一个参数列表和三个过程:

bash_script -> child -> grandchild
Run Code Online (Sandbox Code Playgroud)

参数列表是针对孙子的。我可以修改所有三个进程。祖父脚本为自己获得了一个参数。

以下是将剩余参数传递给孙子的正确方法吗?

#!/usr/bin/env bash
# This is the grandfather    
first_arg="$1"
shift 1;

export MY_ARGS="$@"
Run Code Online (Sandbox Code Playgroud)

我稍后在子进程中“传播”了 env 变量,作为调用孙子进程的命令的一部分,例如:

grandchild --foo "$MY_ARGS"  # append $MY_ARGS as arguments to foo
Run Code Online (Sandbox Code Playgroud)

bash shell-script environment-variables arguments variable

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

如何在变量中重定向 stderr 但在控制台中保留 stdout

我的目标是调用一个命令,在一个变量中获取 stderr,但在屏幕上保留 stdout(并且只有 stdout)。是的,这与大多数人所做的相反:)

目前,我拥有的最好的是:

#!/bin/bash
pull=$(sudo ./pull "${TAG}" 2>&1)
pull_code=$?

if [[ ! "${pull_code}" -eq 0 ]]; then
  error "[${pull_code}] ${pull}"
  exit "${E_PULL_FAILED}"
fi

echo "${pull}"
Run Code Online (Sandbox Code Playgroud)

但这只能在成功的情况下显示标准输出,并且在命令完成后。我想直播标准输出,这可能吗?

编辑

感谢@sebasth,并在没有临时文件的情况将 STDERR 和 STDOUT 重定向到不同变量的帮助下,我写了这个:

#!/bin/bash
{
  sudo ./pull "${TAG}" 2> /dev/fd/3
  pull_code=$?
  if [[ ! "${pull_code}" -eq 0 ]]; then
    echo "[${pull_code}] $(cat<&3)"
    exit "${E_PULL_FAILED}"
  fi
} 3<<EOF
EOF
Run Code Online (Sandbox Code Playgroud)

我承认这不是真正的“美丽”,看起来很棘手,而且我真的不明白为什么需要heredoc ......

这是实现这一目标的更好方法吗?

bash terminal stdout stderr variable

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

间接访问环境变量

鉴于我有一个 bash 脚本

ev=USER
Run Code Online (Sandbox Code Playgroud)

如何使用 ev 获取 $USER 的环境变量值?

尝试天真地做:

echo ${"$"$ev}
Run Code Online (Sandbox Code Playgroud)

这导致糟糕的替代。

我希望能取回 $USER 的任何价值。

bash variable

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

zsh:如何根据另一个变量获取变量的值?

我认为一个例子最能解释我需要什么

_v1="windows"

_v2_windows="/mnt/d"
_v2_osx="/Volumes/d"

echo $_v2_`echo $_v1`
Run Code Online (Sandbox Code Playgroud)

我想回应_v2_windows但使用的值_v1来确定v2要获取两个s 中的哪一个。

我知道可以使用case语句来解决问题,但我试图避免这种情况。

zsh variable

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

在bash中迭代字符串变量行

我有一个脚本,我想在其中使用命令列出 USB 设备lsblk

命令:

$ lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb
Run Code Online (Sandbox Code Playgroud)

这导致

sdb   usb    Kingston DataTraveler 2.0
sdc   usb    Kingston DT 101 G2 
Run Code Online (Sandbox Code Playgroud)

我想将结果保存在一个变量中以便以后工作,所以我写

$ usbs=$(lsblk -o NAME,TRAN,VENDOR,MODEL | grep usb)
Run Code Online (Sandbox Code Playgroud)

我期待的是变量usbs将结果存储在两整行中,如上所示。但如果我跑:

for i in ${usbs[@]}; do
  echo $i
done
Run Code Online (Sandbox Code Playgroud)

我把结果分成几个词:

sdb
usb
Kingston
DataTraveler
2.0
sdc
usb
Kingston
DT
101
G2
Run Code Online (Sandbox Code Playgroud)

问题: 有没有办法,使用grep命令,我可以将命令的结果存储为两整行?

我更愿意知道是否有一个简单的解决方案,而不是将结果转储到文件中然后读取它。

grep bash usb variable lsblk

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

如何在bash脚本中渲染没有引号的变量?

以下脚本:

$ cat runme01.sh 
#!/bin/bash

A=myval
B=$A/{fix}
C=$A/fix

set -xT

echo $B
echo $C
Run Code Online (Sandbox Code Playgroud)

如果运行,则打印以下内容:

$ ./runme01.sh 
+ echo 'myval/{fix}'
myval/{fix}
+ echo myval/fix
myval/fix
Run Code Online (Sandbox Code Playgroud)

如您所见,变量 B传递给echo在单引号,而变量C传递W / O他们。

可能是花括号导致了这种情况。

我想总是不带引号地传递它们。怎么做?

bash quoting variable

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

如何使用 sed 在文件开头附加存储在 shell 变量中的文本?

我在这里找到了有趣的讨论并尝试了给出的解决方案 sed

如何在文件开头插入文本?

/sf/answers/667361551/

它适用于普通文本,但不适用于将文本保存在变量中时。

wolf@linux:~$ cat file.txt 
1
2
3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

将文本 ( <added text>)添加到文件的开头

wolf@linux:~$ sed -i '1s/^/<added text>\n/' file.txt
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

有用!

wolf@linux:~$ cat file.txt 
<added text>
1
2
3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

但是,当我用变量尝试它时,它不再起作用。

wolf@linux:~$ var='Text 1'
wolf@linux:~$ echo $var
Text 1
wolf@linux:~$ 

wolf@linux:~$ cat file.txt 
1
2
3
wolf@linux:~$ sed -i '1s/^/"$var"\n/' file.txt
wolf@linux:~$ cat file.txt 
"$var"
1
2
3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

而不是"$var",我如何调用$varinsed命令的实际值?我使用 GNU sed4.7:

sed (GNU sed) 4.7 Packaged by Debian …
Run Code Online (Sandbox Code Playgroud)

bash sed variable

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

是 while 循环还是管道导致全局变量表现异常

请有人解释一下COUNTER以下代码中变量的奇怪行为(从我的观点来看)?

#!/bin/bash

COUNTER=0

function increment {
    ((COUNTER++))
}

function report {
    echo "COUNTER: $COUNTER ($1)"
}

function reset_counter {
    COUNTER=0
}

function increment_if_yes {
    answer=$1
    if [ "$answer" == "yes" ]
    then
        increment
    fi
}

function break_it {
    echo -e "maybe\nyes\nno" | \
    while read LL
    do
        increment_if_yes $LL
    done    
}

report start # counter should be 0
increment
report one
increment_if_yes yes
report two
increment_if_yes no
report "still two"

reset_counter
report reset

break_it
report "I'd expect one" …
Run Code Online (Sandbox Code Playgroud)

bash shell-script variable

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