小编Ste*_*nny的帖子

购物的危险

在另一个问题中,建议我使用

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

解决一个问题。我的印象是应谨慎使用这些类型命令,也许是因为它们可能会对其他脚本产生不良影响。有人能谈谈这个吗?

bash

5
推荐指数
1
解决办法
1794
查看次数

POSIX 打印函数定义

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 下打印函数定义吗?

shell posix function

5
推荐指数
1
解决办法
2137
查看次数

如何将日期转换为时间戳

我看到了这个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:051332468005与bash shell的?

shell bash date

5
推荐指数
2
解决办法
4万
查看次数

颜色失败反向搜索

我可以输入一个命令:

$ 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)

我可以以某种方式为显示的“失败的反向搜索”部分着色吗?我更喜欢红色文本与普通白色文本的对比。这样我就可以快速判断搜索失败了。

shell colors bash terminal readline

5
推荐指数
1
解决办法
1041
查看次数

便携式检查阵列

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”函数的情况下检测数组吗?

array awk posix mawk gawk

5
推荐指数
1
解决办法
1165
查看次数

转义变量中的双引号

我想将此命令放入稍后运行的文件中:

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) 并转义变量中的任何双引号,但这可以用另一种方式完成吗?

shell posix quoting variable

5
推荐指数
1
解决办法
6276
查看次数

真正退出 awk 脚本

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)

scripting awk exit

5
推荐指数
1
解决办法
3238
查看次数

确定第一个字符串是否以第二个字符串开头

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

shell test

4
推荐指数
2
解决办法
1万
查看次数

管道十六进制字符到 awk

此命令按预期工作

$ 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)

如何克服?

bash awk

3
推荐指数
1
解决办法
1665
查看次数

为什么我应该避免 shell 中的循环?

以下链接建议不要在 shell 中使用循环。

for循环范围内的bash变量

为什么是这样?这是我在遇到该答案时碰巧正在查看的示例循环:

find /etc/postinstall -name '*.sh' | while read script
do
  echo Running $script ...
  $script
  mv $script $script.done
done
Run Code Online (Sandbox Code Playgroud)

shell bash

3
推荐指数
1
解决办法
1575
查看次数

如何获得所有大写的月份

我有两位数的月份值(01 到 12)。我需要获取三个字母的月份缩写(如 JAN、FEB、MAR 等)我可以使用以下命令以混合大小写形式获取它:

date -d "20170711" | date +"%b"
Run Code Online (Sandbox Code Playgroud)

输出是“Jul”我希望它是“JUL”。是否有标准日期选项来获取它?

linux date case

2
推荐指数
2
解决办法
7436
查看次数

标签 统计

shell ×6

bash ×5

awk ×3

posix ×3

date ×2

array ×1

case ×1

colors ×1

exit ×1

function ×1

gawk ×1

linux ×1

mawk ×1

quoting ×1

readline ×1

scripting ×1

terminal ×1

test ×1

variable ×1