在另一个问题中,建议我使用
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
解决一个问题。我的印象是应谨慎使用这些类型命令,也许是因为它们可能会对其他脚本产生不良影响。有人能谈谈这个吗?
Bash 可以打印函数定义:
$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
echo z
}
declare -fx y
Run Code Online (Sandbox Code Playgroud)
然而,这在 POSIX Bash、/bin/sh和/bin/dash下失败:
$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y
Run Code Online (Sandbox Code Playgroud)
可以在 POSIX shell 下打印函数定义吗?
我看到了这个date命令:
date -d @1332468005 '+%Y-%m-%d %H:%M:%S'
Run Code Online (Sandbox Code Playgroud)
导致 :
2012-03-22 22:00:05
Run Code Online (Sandbox Code Playgroud)
我怎样才能将其转换回来自2012-03-22 22:00:05于1332468005与bash shell的?
我可以输入一个命令:
$ echo hello
hello
Run Code Online (Sandbox Code Playgroud)
然后使用 Ctrl+R 搜索它:
(reverse-i-search)`h': echo hello
Run Code Online (Sandbox Code Playgroud)
然后有时搜索会失败:
(failed reverse-i-search)`hz': echo hello
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式为显示的“失败的反向搜索”部分着色吗?我更喜欢红色文本与普通白色文本的对比。这样我就可以快速判断搜索失败了。
Gawk 有“isarray”:
if (isarray(x))
print "is array"
else
print "is scalar"
Run Code Online (Sandbox Code Playgroud)
但是 Mawk 和 "gawk --posix" 不会:
fatal: function 'isarray' not defined
Run Code Online (Sandbox Code Playgroud)
这可能会导致问题:
x
x[1]
fatal: attempt to use scalar 'x' as an array
Run Code Online (Sandbox Code Playgroud)
或者:
x[1]
x
fatal: attempt to use array 'x' in a scalar context
Run Code Online (Sandbox Code Playgroud)
awk 可以在不使用“isarray”函数的情况下检测数组吗?
我想将此命令放入稍后运行的文件中:
ln -s "$xr"/ya.txt ~
Run Code Online (Sandbox Code Playgroud)
我可以用(1)做到这一点:
cat > zu.sh <<eof
ln -s "$xr"/ya.txt ~
eof
Run Code Online (Sandbox Code Playgroud)
或(2):
printf 'ln -s "%s"/ya.txt ~\n' "$xr" > zu.sh
Run Code Online (Sandbox Code Playgroud)
或(3):
echo "ln -s '$xr'/ya.txt ~" > zu.sh
Run Code Online (Sandbox Code Playgroud)
或(4):
printf 'ln -s %q/ya.txt ~\n' "$xr" > zu.sh
Run Code Online (Sandbox Code Playgroud)
或 (5):
printf 'ln -s "%s"/ya.txt ~\n' "${xr//\"/\\\"}"
Run Code Online (Sandbox Code Playgroud)
然而,每个解决方案都是有问题的。如果 (1) 或 (2) 中的变量包含双引号,它们将失败;如果 (3) 中的变量包含单引号,则会失败。(4) 很好,但不是由 POSIX 定义的。(5) 是好的但是是 一种 Bashism。看起来最好的选择是使用 (1) 或 (2) 并转义变量中的任何双引号,但这可以用另一种方式完成吗?
Perl 和 Rubyexit实际退出:
$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1
$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
Run Code Online (Sandbox Code Playgroud)
对 awk 来说不是这样:
$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
Run Code Online (Sandbox Code Playgroud)
我试图用“help.awk”解决这个问题
$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1
$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
Run Code Online (Sandbox Code Playgroud)
但这会产生它自己的问题。如果“prog.awk”只有开始块:
$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
Run Code Online (Sandbox Code Playgroud)
然后运行它:
awk -f help.awk …Run Code Online (Sandbox Code Playgroud) JavaScript 有一个函数:
'world'.startsWith('w')
true
Run Code Online (Sandbox Code Playgroud)
我怎样才能用shell测试这个?我有这个代码:
if [ world = w ]
then
echo true
else
echo false
fi
Run Code Online (Sandbox Code Playgroud)
但它失败了,因为它正在测试平等。我更喜欢使用内置函数,但此页面中的任何实用程序都是可以接受的:
http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
此命令按预期工作
$ awk 'BEGIN {print "\x41"}'
A
Run Code Online (Sandbox Code Playgroud)
像这样
$ printf '\x41' | awk '{print}'
A
Run Code Online (Sandbox Code Playgroud)
但是,当您依靠 awk 识别十六进制字符时,它会失败
$ echo '\x41' | awk '{print}'
\x41
Run Code Online (Sandbox Code Playgroud)
如何克服?
以下链接建议不要在 shell 中使用循环。
为什么是这样?这是我在遇到该答案时碰巧正在查看的示例循环:
find /etc/postinstall -name '*.sh' | while read script
do
echo Running $script ...
$script
mv $script $script.done
done
Run Code Online (Sandbox Code Playgroud) 我有两位数的月份值(01 到 12)。我需要获取三个字母的月份缩写(如 JAN、FEB、MAR 等)我可以使用以下命令以混合大小写形式获取它:
date -d "20170711" | date +"%b"
Run Code Online (Sandbox Code Playgroud)
输出是“Jul”我希望它是“JUL”。是否有标准日期选项来获取它?