我有一个函数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) 有一个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)
如果不可能,请解释原因。
我想使用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 解决方案。
我正在 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)
我怎样才能做到这一点?
我正在尝试调试我的 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)的参数是:
-H"Content-Type:application/json"而不是(我所期望的):
-HContent-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" …
考虑:
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.
到底是怎么回事?
如果我使用以下命令:
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) # 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)
Run Code Online (Sandbox Code Playgroud)-z string True if the length of string is zero. string -n string True if the length of string is non-zero.
我很困惑,它如何同时为零和非零?如何检查键是否具有值(使用bash)?
我正在寻找一种方法来回显以 nlu_setting 开头的所有环境变量的名称和值,因此输出可能如下所示:
nlu_setting_json=true
nlu_setting_global=0
nlu_setting_bar=foo
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
目前我这样做是为了将变量设置为数组中的随机项:
array=("foo" "bar" "baz")
var=${array[$RANDOM % ${#array[@]} ]}
Run Code Online (Sandbox Code Playgroud)
如果我想设置$var为这些值之一,但指定变量将分别设置为每个项目的值的机会,我该怎么办?假设我想要 73.3% 的机会foo,26.6% 的机会bar,以及 0.1% 的机会baz。