标签: array

测试 shell 对数组的支持

是否有一种简洁的方法可以在命令行中测试本地类似 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例如)。

我正在寻找一个简单的测试,它可以无人参与,并在脚本开始时甚至在调用它之前合并到使用部分中。

shell array shell-script

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

将多个目录传递给 find 中的 -prune 选项

我正在使用find定位和删除备份文件,但希望从搜索中排除某些目录。备份文件名可能会终止.bckbak~,或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]。

[1]。https://github.com/andreafrancia/trash-cli

directory find array arguments

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

如何在 bash 数组中捕获 MySQL 结果集?

我在 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。如何修改上述内容以正确创建一个结果数组,其中数组中的每个元素代表结果集中的一行?

bash array shell-script mysql variable

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

zsh 中的数组和循环

我正在尝试在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 脚本经验但有编程背景的人吗?

zsh array

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

sh + 如何在 sh 脚本中使用数组以打印数组中的所有值

我想在我的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

shell array shell-script

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

计算bash数组中元素的个数,其中数组的名字是动态的(即存储在一个变量中)

问题的简要说明:

是否有内置的 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)

bash array parameter shell-script shell-builtin

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

以相反的顺序打印文件行上的所有单词

我不知道如何让我的代码适用于更多行。

这是原始文件 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 array text-processing

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

在数组的循环中,向数组添加一个元素

我在 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当然在不同的行)。

这是行不通的。我该怎么做?

bash array for

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

使用tab作为分隔符将一行拆分为bash中的数组

我有以下格式的文件,它是制表符分隔的

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 array

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

如何迭代zsh中的数组索引?

在 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 中迭代索引的正确方法是什么?

zsh array shell-script

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