是否有一种简洁的方法可以在命令行中测试本地类似 Bourne 的 shell 对数组的支持?
这总是可能的:
$ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi
Run Code Online (Sandbox Code Playgroud)
或测试$SHELL和外壳版本:
$ eval $(echo "$SHELL --version") | grep version
Run Code Online (Sandbox Code Playgroud)
然后阅读手册页,假设我可以访问它。(即使在那里,从写/bin/bash,我假设所有类似Bourne外壳承认的长选项--version,当减免KSH例如)。
我正在寻找一个简单的测试,它可以无人参与,并在脚本开始时甚至在调用它之前合并到使用部分中。
我正在使用find定位和删除备份文件,但希望从搜索中排除某些目录。备份文件名可能会终止.bck,bak,~,或backup。
只有三个要排除的目录的最小工作示例 (MWE) 代码是:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
Run Code Online (Sandbox Code Playgroud)
语法\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune似乎有点笨拙,特别是如果有大约十个目录要排除,尽管我在 MWE 中只显示了三个。
是否有更优雅的方法使用输入文件(带有排除目录的列表)或类似数组或类似列表的构造,可以将其压入服务中?
我很抱歉在我写原始问题时没有更明确。
注意:trash-put是一种将文件移动到Trashcan而不是删除它们的实用程序[1]。
我在 CentOS 7 上使用 bash shell。我想从 shell 脚本运行 MySQL 查询并迭代每行结果。如果有 4 行返回,我想我可以像这样捕获数组中的四行:
query="select p.id, p.ebook_id, es.id FROM ...";
echo "$query" > /tmp/query.sql
mysql -u user --password=pass db_id < /tmp/query.sql > /tmp/query.csv
linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
arraylength=${#linesIN[@]}
echo $arraylength
Run Code Online (Sandbox Code Playgroud)
但是,即使我可以看到返回的多个结果行,也$arraylength总是输出1。如何修改上述内容以正确创建一个结果数组,其中数组中的每个元素代表结果集中的一行?
我正在尝试在zsh.
假设我在 zsh 中有两个数组,它们具有相同的未知元素#,每个数组都包含一个路径列表,例如
LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3)
REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3)
Run Code Online (Sandbox Code Playgroud)
我想使用公共索引同时遍历两个数组,以便我可以执行以下操作:
cd $LOCAL_PATH_i
hg pull $REMOTE_PATH_i
Run Code Online (Sandbox Code Playgroud)
在每次迭代中。我怎样才能在 zsh 中做到这一点?
另外,我在zsh 文档中搜索了循环控制和数组,但收效甚微。有没有介绍zsh中循环、数组等基础知识的好教程?适合那些几乎没有 bash 或 shell 脚本经验但有编程背景的人吗?
我想在我的sh脚本中使用数组。
我的目标是创建一个包含值的数组a b c并打印数组中的所有值。
我成功打印了每个数组,但未能打印数组中的所有值。
下面的例子:
在 arr 中设置每个值:
n=1
eval arr$n=a
n=2
eval arr$n=b
n=3
eval arr$n=c
Run Code Online (Sandbox Code Playgroud)
从 arr 打印每个值:
n=1
eval echo \$arr$n
a
n=2
eval echo \$arr$n
b
n=3
eval echo \$arr$n
c
Run Code Online (Sandbox Code Playgroud)
现在我想打印所有值$arr而不是a b c我得到:
n="*"
eval echo \$arr$n
{*}*
Run Code Online (Sandbox Code Playgroud)
值应该是a b c。
是否有内置的 bash 方法来计算 bash 数组中元素的数量,其中数组的名称是动态的(即存储在变量中),而无需完全复制数组或使用eval?
使用 bash 参数替换,可以执行以下操作:
myArr=(A B C); echo ${#myArr[@]}.NAME=myVar; echo ${!NAME}NAME=myArr[1]; echo ${!NAME}但是如果一个数组的名称存储在另一个变量中,如何确定数组中元素的数量?(人们可能认为这是一种组合上述两个参数替换。)例如:
myArr=(A B C D)
NAME=myArr
# Get the number of elements in the array indirectly referenced by NAME.
count=${#$NAME[@]} # This syntax is invalid. What is the right way?
Run Code Online (Sandbox Code Playgroud)
以下是所有失败的多次尝试:
# Setup for following attempts:
myArr=(A B C D)
NAME=myArr
EXPR1=$NAME[@] # i.e. EXPR1='myArr[@]'
EXPR2=#$NAME[@] # i.e. EXPR2='#myArr[@]' …Run Code Online (Sandbox Code Playgroud) 我不知道如何让我的代码适用于更多行。
这是原始文件 t.txt:
Hello Earth
Hello Mars
Run Code Online (Sandbox Code Playgroud)
但我得到以下输出:
Mars Hello Earth Hello
Run Code Online (Sandbox Code Playgroud)
我的预期输出是这样的:
Earth Hello
Mars Hello
Run Code Online (Sandbox Code Playgroud)
一般来说,我想保持行序不变,但要颠倒单词。对于一般情况输入将是这样的:
one two
four five
Run Code Online (Sandbox Code Playgroud)
和预期的输出是这样的:
two one
five four
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
#!/bin/bash
text=$(cat $1)
arr=($text)
al=${#arr[@]}
let al="al-1"
while (($al >= 0))
do
echo -n "${arr[al]}"
echo -n " "
let al="al - 1"
done
echo
Run Code Online (Sandbox Code Playgroud) 我在 bash 中使用 for 循环有问题。例如:我有一个数组("etc" "bin" "var")。我在这个数组上迭代。但在循环中,我想在数组中附加一些值。例如
array=("etc" "bin" "var")
for i in "${array[@]}"
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
这显示etc bin var(当然在单独的行)。如果我do像这样追加:
array=("etc" "bin" "var")
for i in "${array[@]}"
do
array+=("sbin")
echo $i
done
Run Code Online (Sandbox Code Playgroud)
我想要:(etc bin var sbin当然在不同的行)。
这是行不通的。我该怎么做?
我有以下格式的文件,它是制表符分隔的
a k testis adult male 8 week rRNA
b k testis adult male 8 week rRNA
c k testis adult male 8 week rRNA
Run Code Online (Sandbox Code Playgroud)
我想在每一行上做一些操作,所以我使用了一个 while 循环。我想在选项卡上拆分每一行,然后存储让我们说第 6 列8 week的变量。我正在使用此代码,但无法获得我想要的
while read -r line; do tmp=(${line///}); col6=${tmp[5]}; echo "$col6"; done < file.txt
Run Code Online (Sandbox Code Playgroud)
这给了我8而不是8 week。8 周在 8 和周之间有一个空格,因此我想在选项卡上拆分该行。
在 bash 中,我们可以像这样迭代数组的索引
~$ for i in "${!test[@]}"; do echo $i; done
Run Code Online (Sandbox Code Playgroud)
其中 test 是一个数组,比如说,
~$ test=(a "b c d" e f)
Run Code Online (Sandbox Code Playgroud)
这样输出看起来像
0
1
2
3
Run Code Online (Sandbox Code Playgroud)
但是,当我在 zsh 中执行相同操作时,出现错误:
? ~ for i in "${!test[@]}"; do echo $i; done
zsh: event not found: test[@]
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?
在 zsh 中迭代索引的正确方法是什么?