标签: variable

在 shell 变量与字符串文字比较的两侧添加前缀的目的是什么?

多年来,我多次遇到变量与字符串文字的比较,其中在变量和文字前有一个字符,例如

if [ "x$A" = "xtrue" ]; then
Run Code Online (Sandbox Code Playgroud)

为了检查是否$A"true"

我认为这样做是为了实现 shell 兼容性或解决长期错误、不直观的行为等。没有什么明显的想法。

今天我想我想知道原因,但我的研究没有任何结果。或者也许只是我在频繁接触罕见事件中有所作为。

这种做法是否仍然有用,甚至是最好的?

shell string test variable

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

如果该变量为空/未分配/错误,如何为 BASH 变量赋值?

我正在寻找与此 JS 任务等效的内容:

FOO = FOO || "I must have been falsey!";
Run Code Online (Sandbox Code Playgroud)

谢谢!

bash variable

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

在 awk 中使用 shell 变量

这是我的脚本(查找包含指定模式的文件):

find . -type f \
    -exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Run Code Online (Sandbox Code Playgroud)

我想将我的脚本与参数 § 一起使用:

MyScript.sh pattern
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法将$1变量放入awk.

当我尝试调试我的脚本时

bash -x MyScript.sh pattern
Run Code Online (Sandbox Code Playgroud)

这是输出:

+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
Run Code Online (Sandbox Code Playgroud)

$vawk变量似乎是空的。

任何的想法?

bash awk variable

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

用通配符分配的变量中的参数扩展

我的当前文件夹 (MA502) 中有两个文件,它们的名称是 -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.at.fastq
Run Code Online (Sandbox Code Playgroud)

我有很多这样的文件夹 - 例如 MA503、MA504 等,我想遍历这些文件夹。

我使用通配符分配我的变量名称 -

Forward=*R1*.at.fastq
Reverse=*R2*.at.fastq
Run Code Online (Sandbox Code Playgroud)

我想在脚本中处理这些文件,并且我希望我的输出替换.at.atqt,以便最终名称看起来像 -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.atqt.fastq
Run Code Online (Sandbox Code Playgroud)

我试过

awk 'script' $Forward > ${Forward/.at/.atqt}
Run Code Online (Sandbox Code Playgroud)

我的最终文件名看起来像 -

*R1*.atqt.fastq
Run Code Online (Sandbox Code Playgroud)

而不是我的期望

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq
Run Code Online (Sandbox Code Playgroud)

我已经在 unix 上学习了所有必要的知识,所以我不确定如何处理变量名。任何帮助表示赞赏!

shell bash wildcards variable

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

捕获没有子shell的shell函数的输出

rbenv在机器上安装了(ruby 版本管理器),它的工作原理是这样的:

$ rbenv local
2.3.1
Run Code Online (Sandbox Code Playgroud)

写入标准输出我的 ruby​​ 的本地版本。我想拯救这个版本并在一个变量中声明它以在另一个场合重用。

$ declare -r RUBY_DEFINED_VERSION=$(rbenv local)
$ echo Using ruby version $RUBY_DEFINED_VERSION
Using ruby version 2.3.1
Run Code Online (Sandbox Code Playgroud)

有用!

但我不想使用子外壳来完成工作(使用$()``)。我想使用相同的外壳,我不想创建一个tmp文件来完成这项工作。

有没有办法做到这一点?

注意: declare -r不是强制性的,它可以是一个简单的var=FOOBAR.

shell command-substitution subshell variable

10
推荐指数
3
解决办法
5682
查看次数

在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万
查看次数

如何从字符串中删除最后一个字符?

我有一个变量集var='type_cardio_10-11-2017'。我需要从变量中删除最后 10 个字母,并将剩余的值附加到var2.

我尝试使用以下脚本,但没有按预期工作。

var=type_cardio_10-11-2017
var2=${var} | cut -f1 -d "_"
echo ${var2}
Run Code Online (Sandbox Code Playgroud)

我想要的输出是type_cardio

shell text-processing cut variable

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

如何打印包含不可打印字符的变量?

我想显示$IFS变量的值,它可能包含不可打印的字符(例如:换行符)。

我使用以下命令来做到这一点:

echo -n "$IFS" | hexdump -C
Run Code Online (Sandbox Code Playgroud)

在我的情况下效果很好。

但是使用这个命令有什么问题吗?例如,在echo将某些无法打印的字符打印到它的stdout.

shell character-encoding special-characters variable

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

你能在这个 bash 代码中为我解释这三件事吗?

function我的.bashrc文件中有一个。我知道它是做什么的,它增加了 X 个目录cd

这里是:

up()
{
    local d=""
    limit=$1
    for ((i=1 ; i <= limit ; i++))
      do
        d=$d/..
      done
    d=$(echo $d | sed 's/^\///')
    if [ -z "$d" ]; then
      d=..
    fi
    cd $d
}
Run Code Online (Sandbox Code Playgroud)

但是你能帮我解释一下这三件事吗?

  1. d=$d/..
  2. sed 's/^\///'
  3. d=..

为什么不这样做:

up()
{
    limit=$1

    for ((i=1 ; i <= limit ; i++))
    do
        cd ..
    done
}
Run Code Online (Sandbox Code Playgroud)

用法:

<<<>>>~$ up 3
<<<>>>/$
Run Code Online (Sandbox Code Playgroud)

shell sed cd-command function variable

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

如何 POSIX-ly 计算字符串变量中的行数?

我知道我可以在 Bash 中做到这一点:

wc -l <<< "${string_variable}"
Run Code Online (Sandbox Code Playgroud)

基本上,我发现的一切都涉及<<<Bash 操作符。

但是在 POSIX shell 中,<<<是未定义的,我几个小时都找不到替代方法。我很确定有一个简单的解决方案,但不幸的是,到目前为止我还没有找到。

string shell-script posix variable

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