假设我想执行多个具有类似标志的命令,例如:
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 备份我的系统并排除一些我不需要的目录。
让我们假设一些 bash shell 脚本,例如:
#!/bin/bash
a=3
b=7
set -o posix
set
Run Code Online (Sandbox Code Playgroud)
在这种情况下,执行变量set或其他一些打印环境变量的命令(env,declare...等)输出 mya和b变量,以及环境中的许多变量PATH(和函数)( ,PWD,TEMP...等) )。
有没有办法只打印脚本主体中定义的变量?
我有一个参数列表和三个过程:
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) 我的目标是调用一个命令,在一个变量中获取 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 脚本
ev=USER
Run Code Online (Sandbox Code Playgroud)
如何使用 ev 获取 $USER 的环境变量值?
尝试天真地做:
echo ${"$"$ev}
Run Code Online (Sandbox Code Playgroud)
这导致糟糕的替代。
我希望能取回 $USER 的任何价值。
我认为一个例子最能解释我需要什么
_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语句来解决问题,但我试图避免这种情况。
我有一个脚本,我想在其中使用命令列出 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命令,我可以将命令的结果存储为两整行?
我更愿意知道是否有一个简单的解决方案,而不是将结果转储到文件中然后读取它。
以下脚本:
$ 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他们。
可能是花括号导致了这种情况。
我想总是不带引号地传递它们。怎么做?
我在这里找到了有趣的讨论并尝试了给出的解决方案 sed
如何在文件开头插入文本?
它适用于普通文本,但不适用于将文本保存在变量中时。
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) 请有人解释一下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)