小编jes*_*e_b的帖子

如何检测我是否在子shell中?

我正在尝试编写一个函数来替换exit内置函数的功能,以防止自己退出终端。

我曾尝试使用SHLVL环境变量,但它在子外壳中似乎没有改变:

$ echo $SHLVL
1
$ ( echo $SHLVL )
1
$ bash -c 'echo $SHLVL'
2
Run Code Online (Sandbox Code Playgroud)

我的功能如下:

exit () {
    if [[ $SHLVL -eq 1 ]]; then
        printf '%s\n' "Nice try!" >&2
    else
        command exit
    fi
}
Run Code Online (Sandbox Code Playgroud)

不过,这不允许我exit在子外壳中使用:

$ exit
Nice try!
$ (exit)
Nice try!
Run Code Online (Sandbox Code Playgroud)

检测我是否在子shell中的好方法是什么?

shell bash exit subshell

32
推荐指数
3
解决办法
6316
查看次数

日期命令给出了错误的 12 月 31 日周数

当我尝试获取 12 月 31 日的周数时,它返回 1。当我获取 12 月 30 日的周数时,我得到 52 --- 这是我所期望的。星期一是正确的日子。这是在运行 Ubuntu 的 RPI 上。

$ date -d "2018-12-30T1:58:55" +"%V%a"

52Sun

$ date -d "2018-12-31T1:58:55" +"%V%a"

01Mon
Run Code Online (Sandbox Code Playgroud)

没有时间字符串的相同问题

$ date -d "2018-12-31" +"%V%a"

01Mon
Run Code Online (Sandbox Code Playgroud)

linux command-line date

21
推荐指数
1
解决办法
3855
查看次数

如何在bash中测试数组元素是否都相等?

以下数组表示每台 linux 机器上的磁盘数量

每个单个阵列都包含linux 机器上的磁盘数量。

echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
Run Code Online (Sandbox Code Playgroud)

识别所有数组的值都相等的简单方法是什么?

良好状态:

4 4 4 4 4 4 4 4
Run Code Online (Sandbox Code Playgroud)

状态不佳:

4 4 4 4 4 4 2 4
Run Code Online (Sandbox Code Playgroud)

状态不佳:

6 6 6 6 6 6 6 6 6 6 2 6 2
Run Code Online (Sandbox Code Playgroud)

bash array awk shell-script

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

将键/值添加到 json 对象

我有一个 json 对象存储在 shell 变量中json

{
    "name": "foo",
    "array": [
        {
            "name": "bar",
            "thing": true
        },
        {
            "name": "baz",
            "thing": false
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想new_key向 中的两个对象添加一个新键(让我们称之为 )array。我可以执行以下操作:

$ jq '.array[] + {"new_key": 0}' <<<"$json"
{
  "name": "bar",
  "thing": true,
  "new_key": 0
}
{
  "name": "baz",
  "thing": false,
  "new_key": 0
}
Run Code Online (Sandbox Code Playgroud)

但是,这只返回数组数组,而不返回整个对象。我怎样才能就地修改变量或返回整个对象?

json jq

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

如何对输入进行 JSON 转义?

我正在尝试开发一个工具,用于通过 API 将数据发送到 github gist。问题是 github api 将要点视为content一行,所有转义序列都按字面写出,如下所示:

{
  "test.txt": {
    "filename": "test.txt",
    "type": "text/plain",
    "language": "Shell",
    "raw_url": "https://gist.githubusercontent.com/jessebutryn/5c8b2a95b4b016e2fa33edee294c732b/raw/474f72ad32c843c18e9a61a228a31df6b85a8da1/test.txt",
    "size": 96,
    "truncated": false,
    "content": "#!/bin/sh\n\n# comment\nfunc () {\n\tfor ((i=1;i<10;i++)); do\n\t\t:\n\tdone\n}\n\nprintf '%s\\n' Foo bar baz\n"
  }
}
Run Code Online (Sandbox Code Playgroud)

该内容显示如下:

#!/bin/sh

# comment
func () {
    for ((i=1;i<10;i++)); do
        :
    done
}

printf '%s\n' Foo bar baz
Run Code Online (Sandbox Code Playgroud)

需要将其转换为:

#!/bin/sh\n\n# comment\nfunc () {\n\tfor ((i=1;i<10;i++)); do\n\t\t:\n\tdone\n}\n\nprintf '%s\\n' Foo bar baz\n
Run Code Online (Sandbox Code Playgroud)

有没有任何工具可以一次性完成此操作?sed如果没有,有谁知道如何使用标准 UNIX 工具来完成它?


注意:原始文本中的任何文字转义序列都需要进行转义,以防止 github 解释它们(但这将是一个次要问题,不一定需要在这个问题中解决,但如果有的话那就太好了) :

IE:

printf '%s\n' Foo …
Run Code Online (Sandbox Code Playgroud)

sed text-processing github json text-formatting

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

遇到EOF时“读取”退出1的目的是什么?

bash 手册页说明了有关read内置的以下内容:

退出状态为零,除非遇到文件尾

这最近咬了我,因为我-e设置了选项并使用以下代码:

read -rd '' json <<EOF
{
    "foo":"bar"
}
EOF
Run Code Online (Sandbox Code Playgroud)

我只是不明白为什么在这种情况下非成功退出是可取的。在什么情况下这会有用?

shell read

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

在bash脚本上使用变量卷曲

当我curl在下一个脚本中对命令使用实际值时,它正在工作并返回结果,但是当我使用变量时,它无法正常工作

我认为这是我如何在命令中定义它们的问题

amz_t=$(cat amazon-token.txt )
flx_id=$(cat flex-id.txt )
ses_t=$(cat session-token.txt )

curl -s -H 'Host: flex-capacity-na.amazon.com' \
  -H 'Cookie: session-token='$ses_t'' \
  -H 'x-amz-access-token: '$amz_t'' \
  -H 'x-flex-instance-id: '$flx_id'' \
  -H 'Accept: */*' \
  -H 'User-Agent: iOS/10.2.2 (iPhone Darwin) Model/iPhone Platform/iPhone6,1 RabbitiOS/2.0.141' \
  -H 'Accept-Language: en-us' \
  --compressed 'https://flex-capacity-na.amazon.com/GetOffersForProvider?serviceAreaIds=122' >> output.txt
Run Code Online (Sandbox Code Playgroud)

这是我尝试在脚本中运行的命令,上面提到的 txt 文件只包含某些值,没有垃圾值。

bash ubuntu shell-script curl variable

10
推荐指数
1
解决办法
6万
查看次数

将一列中的所有值替换为 1

我有多个包含 12 行和 3 列的文本文件。

例子:

2       6    0.74  
42      6    0.58  
80      6    0  
112     6    0.24  
132     6    1  
216     6    0.7  
342     6    0  
390     6    0.21  
432     6    0.56  
466     6    0.75  
524     6    0.6  
646     6    0.9 
Run Code Online (Sandbox Code Playgroud)

我想在所有行中将第三列的所有值设置为 1。

输出应如下所示:

2    6   1  
42   6   1  
80   6   1  
112  6   1  
132  6   1  
216  6   1  
342  6   1  
390  6   1  
432  6   1  
466  6   1  
524  6   1  
646  6 …
Run Code Online (Sandbox Code Playgroud)

grep sed awk text-processing replace

9
推荐指数
3
解决办法
4万
查看次数

在一行中重命名具有 2 个条件/替换项的多个文件?

我正在尝试重命名一些图像:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG
Run Code Online (Sandbox Code Playgroud)

我想,以取代IMGimg.JPG.jpg-我知道该怎么做第二部分:

$ rename 's/\.JPG$/\.jpg/' *.JPG
Run Code Online (Sandbox Code Playgroud)

我的问题是,我似乎无法mv IMG_.JPGimg_.jpg-我知道你可以通过多种模式来rename,但我似乎无法使用现有的文件名以小写修正值。

我该怎么做?

rename replace files

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

为什么选择`.` 来表示点命令?

看到这个问题后,我想知道为什么.选择符号来表示点命令

我无法找到太多关于它的起源或谁创建它的信息,并且很好奇为什么选择句号来代表这个命令。

history command historical-unix

8
推荐指数
1
解决办法
401
查看次数