基于Bash脚本中的关联数组,我需要迭代它以获取键和值.
#!/bin/bash
declare -A array
array[foo]=bar
array[bar]=foo
Run Code Online (Sandbox Code Playgroud)
我实际上不明白如何在使用for-in循环时获取密钥.
如何在myconfig.conf
使用BASH 调用的文件中编写多行?
#!/bin/bash
kernel="2.6.39";
distro="xyz";
echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;
Run Code Online (Sandbox Code Playgroud) 我怎样才能qstat
给我完整的工作名称?
我知道qstat -r
提供有关任务的详细信息,但它太多了,并且包含了资源要求.
该qstat -r
输出是这样的:
131806 0.25001 tumor_foca ajalali qw 09/29/2014 15:49:41 1 2-100:1
Full jobname: tumor_focality-TCGA-THCA-ratboost_linear_svc
Hard Resources: distribution=wheezy (0.000000)
h_rt=72000 (0.000000)
mem_free=15G (0.000000)
h_vmem=15G (0.000000)
h_stack=256M (0.000000)
Soft Resources:
131807 0.25001 vital_stat ajalali qw 09/29/2014 15:49:41 1 2-100:1
Full jobname: vital_status-TCGA-LGG-ratboost_linear_svc
Hard Resources: distribution=wheezy (0.000000)
h_rt=72000 (0.000000)
mem_free=15G (0.000000)
h_vmem=15G (0.000000)
h_stack=256M (0.000000)
Soft Resources:
Run Code Online (Sandbox Code Playgroud)
现在我唯一的选择就是根据grep
需要输出:
$ qstat -r | grep "Full jobname" -B1
--
131806 0.25001 tumor_foca ajalali qw …
Run Code Online (Sandbox Code Playgroud) 我想将脚本printf
中的a 的输出bash
指向stderr
而不是stdout
.
我不是要求重定向stderr
或stdout
从哪里重定向到当前路由.我只是希望能够将输出从a发送printf
到stderr
而不是默认值stdout
.
我进行了一些实验,发现如下例所示,附加1>&2
到printf
我想做的事情.但是,我没有使用bash的经验.所以我的主要问题是,是否有" 更好 "的方法来做到这一点bash
?
通过" 更好 "我的意思是有另一种方法来做这个更常用,更传统,或更惯用?一个更有经验的bash程序员将如何做到这一点?
#!/bin/bash
printf "{%s} This should go to stderr.\n" "$(date)" 1>&2
printf "[(%s)] This should go to stdout.\n" "$(date)"
Run Code Online (Sandbox Code Playgroud)
我还有一个次要问题.我问的不是因为我需要知道,而是因为我只是好奇并希望更好地了解正在发生的事情.
看来上面只有在shell脚本中运行时才会起作用.当我从命令行尝试它时似乎不起作用.
这是我的意思的一个例子.
irrational@VBx64:~$ printf "{%s} Sent to stderr.\n" "$(date)" 1>&2 2> errors.txt
{Sat Jun 9 14:08:46 EDT 2012} …
Run Code Online (Sandbox Code Playgroud) 我的相同BASH脚本在Fedora/CentOS中运行.
但我正在测试一个Android eee pad transformer
.
我有终端访问权限,我写了一个小测试脚本.但它无法正常工作,我该如何解决?我究竟做错了什么?
/data/data/berserker.android.apps.sshdroid/home $ cat test.sh
#!/bin/bash
var=`ifconfig -a`;
echo $var;
/data/data/berserker.android.apps.sshdroid/home $ chmod +x test.sh
/data/data/berserker.android.apps.sshdroid/home $ ./test.sh
sh: ./test.sh: not found
/data/data/berserker.android.apps.sshdroid/home $ uname -a
Linux localhost 2.6.36.3-00004-g069b8b5 #1 SMP PREEMPT Wed May 11 22:14:22 CST 2011 armv7l GNU/Linux
/data/data/berserker.android.apps.sshdroid/home $ bash ./test.sh
sh: bash: Permission denied
/data/data/berserker.android.apps.sshdroid/home $ ls -l /bin/bash
ls: /bin/bash: No such file or directory
/data/data/berserker.android.apps.sshdroid/home $ find / -name "bash"
find: /config: Permission denied
lots more.......
find: …
Run Code Online (Sandbox Code Playgroud) 我对bash编程比较陌生,我目前正在创建一个简单的计算器.
它需要使用浮点数并检查它们是否如此.
我有一个checkNumbers函数:
function checkNumber {
regExp=[0-9]
if [ $testNo =~ $regExp ]
then
echo "That is a number!"
let check=1
else
echo "Damn! Not A Number!"
fi
}
Run Code Online (Sandbox Code Playgroud)
我让用户输入这样的数字:
while [ $check -eq 0]
do
echo "Please enter a number
read testNo
echo ""
checkNumber
done
Run Code Online (Sandbox Code Playgroud)
这不起作用,我得到这个错误:
./calculator.sh:39行:[:=〜:二元运算符预期
第39行是:
if [ $testNo =~ $regExp ]
Run Code Online (Sandbox Code Playgroud)
我尝试了很多正则表达式,如:
^*[0-9]*$
Run Code Online (Sandbox Code Playgroud)
和
^*[0-9]\.[0.9]*$
Run Code Online (Sandbox Code Playgroud)
等等
另外,我已经结合其他方式执行检查:
case $testNo
in
^*[0-9]*$) echo "That is a number!";;
*) echo "Error! Not a number!";;
esac
Run Code Online (Sandbox Code Playgroud)
和
if …
Run Code Online (Sandbox Code Playgroud) 我把以下内容写入我的.bashrc失败了
shopt -s globstar
Run Code Online (Sandbox Code Playgroud)
我正在尝试测试命令
ls **/*.c
Run Code Online (Sandbox Code Playgroud)
并通过比较它
ls */*/*.c
Run Code Online (Sandbox Code Playgroud)
如何在Bash 4中启用globstar?
我无法在bash 4.1中使用正则表达式来正确匹配模式.我已经阅读了有关引号与引号差异的一些信息,但我不认为这是我的问题.
我的目标是检查并确保脚本提供有效的ID.在这种情况下,有效ID是9位数的字符串.据我所知,正则表达式是\ d {9}.鉴于这是我要检查的代码片段:
id=$1
if [[ $id =~ \d{9} ]]; then
echo "This is a vaild ID"
else
echo "This is not a vaild ID"
fi
Run Code Online (Sandbox Code Playgroud)
然后调用脚本:
./script 987654321
Run Code Online (Sandbox Code Playgroud)
显而易见的是我错过了什么?
我正在用bash编写一个脚本,我希望它能够执行命令并分别处理每一行.例如:
LINES=$(df)
echo $LINES
Run Code Online (Sandbox Code Playgroud)
它将返回所有输出转换带空格的新行.
例:
如果输出应该是:
1
2
3
Run Code Online (Sandbox Code Playgroud)
然后我会得到
1 2 3
Run Code Online (Sandbox Code Playgroud)
如何将命令的输出放入变量中,使新行仍然是新行,这样当我打印变量时,我会获得正确的输出?
如何将运行脚本时的错误输出保存到文件中?我的代码如下,但代码不会跟踪错误并将错误保存到 test.log14。有人能给我提示一下我的代码中可能有什么问题吗?
LOGFILE=/usr/local/etc/backups/test14.log
"$(date "+%m%d%Y %T") : Starting work" >> $LOGFILE 2>&1
Run Code Online (Sandbox Code Playgroud)