如何将运行脚本时的错误输出保存到文件中?我的代码如下,但代码不会跟踪错误并将错误保存到 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) 我如何更换\ r?
#!/bin/bash
...
# setup
if [[ $i =~ $screen ]]; then
ORIGINAL=${BASH_REMATCH[1]} # original value is: 3DROTATE\r
AFTER =${ORIGINAL/\\r/} # does not replace \r
myThirdPartyApplication -o $replvar # FAILS because of \r
fi
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Bash 中编写一个未找到的句柄,它执行以下操作:
cd进入它。$DEV_DIR,`cd 进入它。现在我有这样的事情:
export DEV_DIR=/Users/federico/programacion/
function command_not_found_handle () {
if [ -d $1 ]; then # the dir exists in '.'
cd $1
else
to=$DEV_DIR$1
if [ -d $to ]; then
cd $to
echo `pwd`
else
echo "${1}: command not found"
fi
fi
}
Run Code Online (Sandbox Code Playgroud)
尽管它似乎在工作(该echo pwd命令打印了预期的目录),但实际 shell 中的目录并没有改变。
我的印象是,因为这是我.bashrc的 shell 中的一个函数,所以我不会分叉,我可以这样做,cd但显然这不起作用。任何有关如何解决此问题的提示将不胜感激。
是否还有一些用于bash的文本用户界面(TUI)框架(除此之外)?:http://code.google.com/p/bashsimplecurses/
一直在寻找有关 bash 正则表达式的一些更高级的正则表达式信息,但没有找到太多相关信息。
这是一个简单的字符串的概念:
myString="DO-BATCH BATCH-DO"
if [[ $myString =~ ([[:alpha:]]*)-([[:alpha:]]*) ]]; then
echo ${BASH_REMATCH[1]} #first perens
echo ${BASH_REMATCH[2]} #second perens
echo ${BASH_REMATCH[0]} #full match
fi
outputs:
BATCH
DO
DO-BATCH
Run Code Online (Sandbox Code Playgroud)
很好,它完成了第一场比赛(BATCH-DO),但是我如何拉第二场比赛(DO-BATCH)?我只是在这里画一个空白,找不到关于 bash 正则表达式的太多信息。
在使用bash版本3的服务器中,我这样做:
bash3$ e="tar xfz"; [[ "$e" =~ "^tar" ]] && echo 0 || echo 1
0
Run Code Online (Sandbox Code Playgroud)
但是当我在bash版本4中执行相同的命令时
bash4$ e="tar xfz"; [[ "$e" =~ "^tar" ]] && echo 0 || echo 1
1
Run Code Online (Sandbox Code Playgroud)
我在CentOS,Fedora和Ubuntu中尝试过它并得到了相同的结果.怎么了?
在 bash 4(及更高版本)中,要大写存储在 variable 中的字符串的第一个字母L1,我可以执行以下操作:
L1=en
Ll1=${L1^}
echo $Ll1
Run Code Online (Sandbox Code Playgroud)
这打印En.
我正在尝试在 Makefile 中做类似的事情,但我无法使${L1^}语法起作用。
SHELL := /bin/bash
L1 = en
Ll1 := $(shell echo ${L1^})
all:
@echo $(Ll1)
Run Code Online (Sandbox Code Playgroud)
产生空白输出。
我可以在不求助于 tr/sed 的情况下使用这种 bash 语法吗?
PS我确实需要将它分配给一个变量而不是直接回显它。我正在使用 bash 4.3.48 和 GNU make 4.1。
这是我的$a输出:
[root@node1 ~]# echo "${a}"
/dev/vdc1 /gfs1
/dev/vdd1 /elastic
mfsmount /usr/local/flytxt
Run Code Online (Sandbox Code Playgroud)
我必须将这些存储在关联数组中fsmounts,第一列作为键,第二列作为值。
这是我的代码:
declare -A fsmounts
echo "$a" | while read i ; do key=$(echo "$i" | awk '{print $1}'); value=$(echo "$i" | awk '{print $2}');fsmounts[$key]=$value; done;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在循环外打印时
[root@node1 ~]# echo ${fsmounts[/dev/vdb1]}
Run Code Online (Sandbox Code Playgroud)
空白是输出。我认为关联数组 fsmounts 实际上并没有存储值。请帮我。
但我实际上可以fsmounts[$key]在循环内回声。看到这个:
echo "$a" | while read i ; do key=$(echo "$i" | awk '{print $1}'); value=$(echo "$i" | awk '{print $2}');fsmounts[$key]=$value; echo ${fsmounts[$key]}; done;
/gfs1
/elastic
/usr/local/flytxt
Run Code Online (Sandbox Code Playgroud) 我有以下代码读取fieldsJson 文件的所有内容(路径是PRIVATE_REGISTRATION_FILE并将它们存储到PRIVATE_FIELDS我稍后在代码中查询的关联数组 ( ) 中:
declare -A PRIVATE_FIELDS
for PRICING_FIELD in $(jq -c -r '.fields[]' "${PRIVATE_REGISTRATION_FILE}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
PRIVATE_FIELDS["${FIELD_KEY}"]=${PRICING_FIELD}
done
Run Code Online (Sandbox Code Playgroud)
问题是我对多个文件执行了多次此操作,即使逻辑始终相同。
因此,我想将这个逻辑提取到一个函数中,但我很难将 map 参数传递给它。
这是我尝试的:
function update_array
{
FILE_NAME=$1
eval "declare -A MAP="${2#*=}
for PRICING_FIELD in $(jq -c -r '.fields[]' "${FILE_NAME}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
MAP["${FIELD_KEY}"]=${PRICING_FIELD}
done
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
declare -A PRIVATE_FIELDS
update_array "myFile.json" "$(declare -p PRIVATE_FIELDS)"
Run Code Online (Sandbox Code Playgroud)
但是它不起作用,地图仍然是空的。
echo ${PRIVATE_FIELDS["someKey"]}
>>> (empty)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这个答案中提出的每个解决方案,但没有一个有效。我究竟做错了什么?
bash …