多年来,我多次遇到变量与字符串文字的比较,其中在变量和文字前有一个字符,例如
if [ "x$A" = "xtrue" ]; then
Run Code Online (Sandbox Code Playgroud)
为了检查是否$A是"true"。
我认为这样做是为了实现 shell 兼容性或解决长期错误、不直观的行为等。没有什么明显的想法。
今天我想我想知道原因,但我的研究没有任何结果。或者也许只是我在频繁接触罕见事件中有所作为。
这种做法是否仍然有用,甚至是最好的?
我正在寻找与此 JS 任务等效的内容:
FOO = FOO || "I must have been falsey!";
Run Code Online (Sandbox Code Playgroud)
谢谢!
这是我的脚本(查找包含指定模式的文件):
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变量似乎是空的。
任何的想法?
我的当前文件夹 (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 上学习了所有必要的知识,所以我不确定如何处理变量名。任何帮助表示赞赏!
我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.
当我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 文件只包含某些值,没有垃圾值。
我有一个变量集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。
我想显示$IFS变量的值,它可能包含不可打印的字符(例如:换行符)。
我使用以下命令来做到这一点:
echo -n "$IFS" | hexdump -C
Run Code Online (Sandbox Code Playgroud)
在我的情况下效果很好。
但是使用这个命令有什么问题吗?例如,在echo将某些无法打印的字符打印到它的stdout.
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)
但是你能帮我解释一下这三件事吗?
d=$d/..sed 's/^\///'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) 我知道我可以在 Bash 中做到这一点:
wc -l <<< "${string_variable}"
Run Code Online (Sandbox Code Playgroud)
基本上,我发现的一切都涉及<<<Bash 操作符。
但是在 POSIX shell 中,<<<是未定义的,我几个小时都找不到替代方法。我很确定有一个简单的解决方案,但不幸的是,到目前为止我还没有找到。