我试图以下面的方式在bash中创建一个关联数组
#!/bin/bash
hash["name"]='Ashwin'
echo ${hash["name"]}
Run Code Online (Sandbox Code Playgroud)
这将打印所需的输出:Ashwin执行时.
但是当钥匙有空间时,
#!/bin/bash
hash["first name"]='Ashwin'
echo ${hash["first name"]}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
test2.sh: line 2: first name: syntax error in expression (error token is "name")
Run Code Online (Sandbox Code Playgroud)
钥匙不允许有空格吗?
问题在于08和09号.我用Google搜索了这个,并找出08和09有问题的原因,但没有解决方案.
这是一个荒谬的例子,用于简要描述我的问题而不深入细节.
cursorDay=2;
let cursorDay=$cursorDay+1;
case "$cursorDay" in
1) cursorDay=01;;
2) cursorDay=02;;
3) cursorDay=03;;
4) cursorDay=04;;
5) cursorDay=05;;
6) cursorDay=06;;
7) cursorDay=07;;
8) cursorDay=08;;
9) cursorDay=09;
esac
echo "$cursorDay";
Run Code Online (Sandbox Code Playgroud)
我期望的输出是"03",实际上我确实得到了输出.但如果我做同样的事情尝试获得08或09,我这个错误:
line 100: let: cursorDay=08: value too great for base (error token is "08")
Run Code Online (Sandbox Code Playgroud)
问题是,有没有办法"强制"它将08和09视为常规数字?我发现了几个帖子详细说明如何消除零,但我想要零.
我正在尝试创建一个与数据一起运行的bash脚本的日志文件.我目前有这个:
bash script.sh > /var/log/%Y-%m-%d_%H:%M.log
Run Code Online (Sandbox Code Playgroud)
问题是日志文件实际写入%Y-%m-%d_%H:%M而不是日期.是否有办法通过仅在控制台中运行日期来实际写出日期?
这是我第一次尝试BASH,我遇到了一个小问题.此脚本的目的是擦除ZFS池并创建日志文件.
代码按预期工作,除了下面的第19行.(LogEntry $ LOG_LINE).为了调试目的,我添加了第18行,它正在运行.
第18行将"pool'tankm'健康"写入日志,而第19行只写"pool".从功能上讲,这些线路做的是同样的事情(至少在我眼里),所以为什么一个工作而不是另一个工作.
我假设根casue是zpool status命令输出中池名称之前的引用,我正在为此替换char,但我会理解这两行是如何以不同方式进行间接的.
在此感谢Declan
#!/bin/bash
LOG_FILE=/home/declan/log/zfs_scrub
LOG_LAST=/home/declan/log/zfs_scrub_last
function LogEntry {
echo -e "$(date "+%Y %m %d %T") ; $1" >>$LOG_FILE 2>&1
}
cp $LOG_FILE $LOG_LAST
rm $LOG_FILE
LogEntry "Starting ZFS Scrub"
for POOL in $(zpool list -H -o name) ; do
LogEntry "Starting Scrub on $POOL"
zpool scrub $POOL 2>/dev/null
LOG_LINE=$(zpool status -x $POOL 2>&1)
echo -e "$(date "+%Y %m %d %T") ; $LOG_LINE" >>$LOG_FILE 2>&1
LogEntry $LOG_LINE
LogEntry "Ending Scrub on $POOL"
done
LogEntry "Ending …Run Code Online (Sandbox Code Playgroud) 我在OS X(10.8.3)上安装了watchrgem install watchr.它安装在/ usr/bin/watchr中
$ which watchr
/usr/bin/watchr
Run Code Online (Sandbox Code Playgroud)
但是,当我试图调用它时$ watchr -v,系统找不到它.
$ watchr -v
-bash: /usr/local/bin/watchr: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我认为这与我的机器上的路径设置有关.我的问题:
/usr/bin/对比/usr/local/bin/?$ /usr/bin/watchr -e 'watch(./hello.txt) ...',我们是在查看当前目录中的hello.txt还是在/ usr/bin /中与watchr相同的目录?我发现我的bash脚本的结果会改变,具体取决于我是否通过调试执行它(即调用set -x).我并不是说我得到更多输出,但程序本身的结果不同.
我假设这不是理想的行为,我希望你能教会我如何纠正这个问题.
下面的bash脚本是一个人为的例子,我尝试从我正在调查的脚本中减少逻辑,以便问题可以很容易地重现和显而易见.
#!/bin/bash
# Base function executes command (print working directory) stores the value in
# the destination and returns the status.
function get_cur_dir {
local dest=$1
local result
result=$((pwd) 2>&1)
status=$?
eval $dest="\"$result\""
return $status
}
# 2nd level function uses the base function to execute the command and store
# the result in the desired location. However if the base function fails it
# terminates the script. Yes, I know 'pwd' won't fail -- …Run Code Online (Sandbox Code Playgroud) 对于上下文,我正在尝试创建一个shell脚本,它简化了ffmpeg的实时控制台输出,只显示正在编码的当前帧.我的最终目标是在批处理的某种进度指示器中使用此信息.
对于那些不熟悉ffmpeg输出的人,它将编码的视频信息输出到stdout,并将控制台信息输出到stderr.此外,当它实际显示编码信息时,它使用回车来防止控制台屏幕填满.这使得不可能简单地使用grep和awk来捕获适当的行和帧信息.
我尝试过的第一件事是使用tr替换回车:
$ ffmpeg -i "ScreeningSchedule-1.mov" -y "test.mp4" 2>&1 | tr '\r' '\n'
这适用于它向控制台显示实时输出.但是,如果我然后将该信息传递给grep或awk或其他任何东西,tr的输出将被缓冲并且不再是实时的.例如:$ ffmpeg -i "ScreeningSchedule-1.mov" -y "test.mp4" 2>&1 | tr '\r' '\n'>log.txt导致文件立即填充一些信息,然后5-10秒后,更多行被删除到日志文件中.
起初我认为sed对于这个很好:$ # ffmpeg -i "ScreeningSchedule-1.mov" -y "test.mp4" 2>&1 | sed 's/\\r/\\n/'但是它会在所有回车的情况下到达行并等待处理完成之后再尝试做任何事情.我认为这是因为sed在逐行的基础上工作,并且需要整个行在它做任何其他事情之前完成,然后它不会替换回车.我已经尝试了各种不同的正则表达式用于回车和换行,并且尚未找到替代回车的解决方案.我正在运行OSX 10.6.8,所以我使用的是BSD sed,这可能是其中的原因.
我还尝试将信息写入日志文件并用于tail -f读取它,但我仍然遇到了实时替换回车的问题.
我已经看到在python和perl中有解决方案,但是,我不愿意立即走这条路.首先,我不知道python或perl.其次,我有一个功能齐全的批处理shell应用程序,我需要移植或找出如何与python/perl集成.可能并不难,但不是我想要进入的,除非我绝对必须这样做.所以我正在寻找一个shell解决方案,最好是bash,但任何OSX shell都可以.
如果我想要的东西根本不可行,那么当我到达那里时,我想我会越过那座桥.
我试图在bash中编写脚本,它将循环遍历所有子目录,从给定路径主演,并将创建当前目录中所有文件的md5总和的列表.
我需要类似的东西ls -R,但我不知道如何开始
以下是对一些问题(特别是对于shell)的许多评论,这些问题基本上表示以下一个或多个:
$filaneme是目录而不是常规文件,这将失败,虽然我知道每个脚本都需要自己的测试环境,但这些是脚本应该免受攻击的常见问题.
因此,我的目的是编写一个脚本,它将创建一些带有"特制"文件名的目录层次结构,以便进行测试.
问题是:什么"特殊"文件名对这个测试有好处?
目前我有(脚本创建文件和目录):
- (比如命令参数)# (评论char)! (命令历史)| 炭(管)() 字符*和?(通配符)还有什么我不应该错过的想法吗?
我很难理解我的ubuntu中写的.bashrc内容,如下所示.这是我不明白的:
花括号和后面使用的-/ +符号的目的是什么:?(例如:$ {debian_chroot: - }和$ {debian_chroot:+($ debian_chroot)})
该eval命令.
以下代码片段如何工作.
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
Run Code Online (Sandbox Code Playgroud)bash ×10
linux ×3
shell ×2
arrays ×1
command-line ×1
console ×1
curly-braces ×1
eval ×1
ffmpeg ×1
function ×1
leading-zero ×1
list ×1
loops ×1
macos ×1
quotes ×1
subdirectory ×1
unix ×1
variables ×1
watchr ×1