相关疑难解决方法(0)

从管道中将值读入shell变量

我试图让bash处理来自stdin的数据,但是没有运气.我的意思是以下工作:

echo "hello world" | test=($(< /dev/stdin)); echo test=$test
test=

echo "hello world" | read test; echo test=$test
test=

echo "hello world" | test=`cat`; echo test=$test
test=
Run Code Online (Sandbox Code Playgroud)

我想要输出的地方test=hello world.我试过把""引号括起来"$test"也不起作用.

linux bash pipe

193
推荐指数
12
解决办法
30万
查看次数

在while循环内修改的变量不会被记住

在下面的程序中,如果我$foo在第一个if语句中将变量设置为值1 ,那么它的作用就是在if语句之后记住它的值.但是,当我将同一个变量设置ifwhile语句内部的值2时,它在while循环之后就被遗忘了.它的行为就像我$foowhile循环中使用某种变量的副本而我只修改那个特定的副本.这是一个完整的测试程序:

#!/bin/bash

set -e
set -u 
foo=0
bar="hello"  
if [[ "$bar" == "hello" ]]
then
    foo=1
    echo "Setting \$foo to 1: $foo"
fi

echo "Variable \$foo after if statement: $foo"   
lines="first line\nsecond line\nthird line" 
echo -e $lines | while read line
do
    if [[ "$line" == "second line" ]]
    then
    foo=2
    echo "Variable \$foo updated to $foo inside if inside while loop"
    fi
    echo "Value …
Run Code Online (Sandbox Code Playgroud)

bash scope sh while-loop

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

为什么管道输入"读取"仅在输入"while read ..."构造时有效?

我一直在尝试从程序输出中读取环境变量的输入,如下所示:

echo first second | read A B ; echo $A-$B 
Run Code Online (Sandbox Code Playgroud)

结果是:

-
Run Code Online (Sandbox Code Playgroud)

A和B都是空的.我读到了bash在子shell中执行管道命令,并且基本上阻止了管道输入读取.但是,以下内容:

echo first second | while read A B ; do echo $A-$B ; done
Run Code Online (Sandbox Code Playgroud)

似乎工作,结果是:

first-second
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里的逻辑是什么吗?是while...... done构造中的命令实际上是在同一个shell中执行echo而不是在子shell中执行?

bash pipe while-loop piping

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

Bash:使用管道进入进程替换的退出代码到while循环

以下脚本调用另一个程序在while循环中读取其输出(请参阅Bash - 如何将输入传递给while循环并在循环结束后保留​​变量):

while read -r col0 col1; do
    # [...]
done < <(other_program [args ...])
Run Code Online (Sandbox Code Playgroud)

如何检查退出代码other_program以查看循环是否正确执行?

bash process-substitution

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

从管道命令附加到数组变量

我正在编写一个bash函数来获取所有git存储库,但是当我想将所有git存储库路径名存储到数组时,我遇到了一个问题patharray.这是代码:

gitrepo() {
    local opt

    declare -a patharray
    locate -b '\.git' | \
        while read pathname
        do
            pathname="$(dirname ${pathname})"
            if [[ "${pathname}" != *.* ]]; then
            # Note: how to add an element to an existing Bash Array
                patharray=("${patharray[@]}" '\n' "${pathname}")
                # echo -e ${patharray[@]}
            fi
        done
    echo -e ${patharray[@]}
}
Run Code Online (Sandbox Code Playgroud)

我想将所有存储库路径保存到patharray数组中,但是我无法将pipeline其包含在包含locatewhile命令的范围之外.
但是我可以在pipeline命令中获取数组,# echo -e ${patharray[@]}如果取消注释,注释命令运行良好,那么我该如何解决问题呢?

我已经尝试过该export命令,但似乎无法将其传递patharray给管道.

arrays bash pipeline

5
推荐指数
2
解决办法
993
查看次数

将文件中的键/值参数读取到 shell 脚本中

我的脚本几乎可以运行了。这样做的目的是从文件中获取定义的值,然后在运行时将这些值填充到 shell 脚本中。

请看看我这里有什么...

第一个文件:ab.sh

#!/bin/bash
USER_TYPE=$1 #IDENTIFY USER TYPE TYPE1,TYPE2,TYPE3,TYPE4
USERNAME=$2
PERMISSION_TYPE=$3 #IDENTIFY PERMISSION TYPE SELECT,UPDATE,DELETE,INSERT
TARGET_USER=$4
TARGET_TABLE=$5

if [ $USER_TYPE == 'TYPE1' ]
        then
cat Parameters.conf |while read USERNAME
do
sqlplus / as sysdba <<  E00
CREATE USER ${USERNAME}
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
ACCOUNT UNLOCK;
ALTER USER ${USERNAME} DEFAULT ROLE ALL;
GRANT CREATE SESSION TO ${USERNAME};
GRANT CONNECT TO ${USERNAME};
exit
E00
done

cat p.conf |while read PERMISSION_TYPE TARGET_SCHEMA TARGET_TABLE USERNAME
do
sqlplus / as sysdba …
Run Code Online (Sandbox Code Playgroud)

bash if-statement while-loop do-while

5
推荐指数
1
解决办法
6824
查看次数

以编程方式获取最新的 python 3 版本

我想从https://www.python.org/ftp/python/获取最新的 python 源代码。发布此内容时,最新版本是 3.9.1。我不想在代码中硬编码 3.9.1 以获取最新版本并在新版本出现时继续更新版本。我使用的是 ubuntu 16.04 操作系统

是否有一种编程方式来获取最新的Python版本(使用curl)并使用该版本来获取最新的源代码?

python pip python-3.x

5
推荐指数
1
解决办法
774
查看次数