我遇到了许多带有变量的shell脚本,我一直认为存在严重的误解.我的理解是,按照惯例(也许很久以前就必须),环境变量都是全部的.
但是在像Bash这样的现代脚本环境中,我总是倾向于使用临时变量的小写名称约定,而仅为导出(即环境)变量使用大写的约定.例如:
#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export JAVA_HOME="$HOME/java"
Run Code Online (Sandbox Code Playgroud)
这一直是我对事物的看法.是否有任何权威来源同意或不同意这种方法,还是纯粹是风格问题?
我想知道以下内容;
非工作的例子
> ids=(1 2 3 4);echo ${ids[*]// /|}
1 2 3 4
> ids=(1 2 3 4);echo ${${ids[*]}// /|}
-bash: ${${ids[*]}// /|}: bad substitution
> ids=(1 2 3 4);echo ${"${ids[*]}"// /|}
-bash: ${"${ids[*]}"// /|}: bad substitution
Run Code Online (Sandbox Code Playgroud)
工作实例
> ids=(1 2 3 4);id="${ids[@]}";echo ${id// /|}
1|2|3|4
> ids=(1 2 3 4); lst=$( IFS='|'; echo "${ids[*]}" ); echo $lst
1|2|3|4
Run Code Online (Sandbox Code Playgroud)
在上下文中,用于sed命令的分隔字符串用于进一步解析.
我有一个数组,我正在像这样打印它:
echo "${data[*]}"
Run Code Online (Sandbox Code Playgroud)
输出:
/QE-CI-RUN-71/workspace/QE-AU/57/testng-results_1.xml
/QE-CI-RUN-71/workspace/QE-AU/57/testng-results_2.xml
Run Code Online (Sandbox Code Playgroud)
我想将上述输出存储为逗号分隔值。我怎样才能在 Bash 中实现这一目标?
数据数组是动态的,它可以有任意数量的值。
我正在尝试使用旧的getenv方法将数组从bash传递给python但是我一直收到此错误:
./crcFiles.sh: line 7: export: `0021': not a valid identifier
Traceback (most recent call last):
File "/shares/web/vm3618/optiload/prog/legalLitres.py", line 30, in <module>
for i in mdcArray.split(' '):
AttributeError: 'NoneType' object has no attribute 'split'
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么$ mdcNo没有成功从bash传递到python吗?
代码.sh:
#!/bin/bash
mdcNo=('0021' '0022' '0036' '0055' '0057' '0059' '0061' '0062' '0063' '0065' '0066' '0086' '0095' '0098' '0106' '0110' '0113' '0114' '0115' '0121' '0126' '0128' '0135' '0141' '0143' '0153' '0155' '0158')
localDIR=/shares/web/vm3618/optiload/prog
export mdcNo
$localDIR/legalLitres.py
for i in "${mdcNo[@]}"
do
echo $i
cp $localDIR/MDC$i/*/QqTrkRec.txt $localDIR/crccalc/.
cd …
Run Code Online (Sandbox Code Playgroud) 我有以下要在awk中解决的问题。我有一个大的文本表,用逗号分隔,由100k行和5k cols组成。第一行是标题,第一列是记录ID。然后,我有了第二个文本文件,其中包含第一个文件中标头的子集。我想提取第一个文件的所有列,其标题包含在第二个文件中给出的列表中。这里是输入和所需输出的示例:
数据文件
ID, head1, head2, head3, head4
1, 25.5, 1364.0, 22.5, 13.2
2, 10.1, 215.56, 1.15, 22.2
Run Code Online (Sandbox Code Playgroud)
列表文件
head1
head4
Run Code Online (Sandbox Code Playgroud)
所需的输出:
ID, head1, head4
1, 25.5, 13.2
2, 10.1, 22.2
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一些有关如何以awk或通过unix脚本解决此问题的建议吗?在此先感谢您的帮助!
我正在搜索一个文件,比如"file1.txt",并且find命令的输出如下所示.
/home/nicool/Desktop/file1.txt
/home/nicool/Desktop/dir1/file1.txt
/home/nicool/Desktop/dir1/dir2/file1.txt
Run Code Online (Sandbox Code Playgroud)
在上面的例子中我只想要共同的父目录,在上面的例子中是"/ home/nicool/Desktop".如何使用bash实现?请帮助找到这种问题的一般解决方案.
我正在尝试一些非常简单的事情:
PEOPLE=(
"nick"
"bob"
)
export PEOPLE="$(IFS=, ; echo "${PEOPLE[*]}")"
echo "$PEOPLE" # prints 'nick,bob'
./process-people.sh
Run Code Online (Sandbox Code Playgroud)
出于某种原因,process-people.sh
没有看到$PEOPLE
. 就像,如果 I echo "$PEOPLE"
from inside process-people.sh
,它会打印一个空行。
据我了解,通过调用创建的子进程./process-people.sh
应该继承父进程的所有环境变量,包括$PEOPLE
. 然而,我在 Bash 3.2.57(1)-release 和 4.2.46(2)-release 上都试过这个,但它不起作用。
这里发生了什么?
假设我有一个这样的数据数组:
arr[0] = "someText1 (x,y,z) a"
arr[1] = "someText2 (x,y,z) b"
Run Code Online (Sandbox Code Playgroud)
如何使用Bash按字典顺序排列此数组[仅考虑文本]?
如何在Bash中使用单引号和逗号转换数组元素。
arr=("element1" "element2" "element3")
#element1 element2 element3
Run Code Online (Sandbox Code Playgroud)
所需结果
'element1','element2','element3'
根据Martin Clayton的答案,使用IFS可以得到逗号分隔的值,
SAVE_IFS="$IFS"
IFS=","
ARRJOIN="${arr[*]}"
IFS="$SAVE_IFS"
echo "$ARRJOIN"
#element1,element2,element3
Run Code Online (Sandbox Code Playgroud)
但是如何在每个元素上添加单引号。
如果我输入IP" 127 ":我想生成从127.0.0.1到127.255.255.255的所有内容
如果我输入IP" 127.0 ",我想生成从127.0.0.1到127.0.255.255的所有内容
如果我输入IP" 127.0.0 ",我想生成从127.0.0.1到127.0.0.255的所有内容
使用netaddr