我正在学习shell脚本,并坚持使用这个实验性的shell脚本:
#!/usr/bin/env bash
A=1
(A=2;echo "A is $A in $SHLVL")
echo "A is $A in $SHLVL"
exit 0
毫无疑问,第三行和第四行的$A是不同的,这可以解释为父进程不能读取子进程中创建的变量,即子subshell。但是,第3行和第4行的$SHLVL是相同的,我认为第3行的$A应该比第4行的$A大1。不是在子subshell中执行第3行的命令吗?我不知道我在哪里误解了。
foo() {
if [[ something ]]; then
echo "The foo function was called directly."
else
echo "The foo function was invoked via command substitution."
fi
}
直接呼叫foo:
foo
foo函数被直接调用。
通过命令替换调用foo:
a=$(foo) || exit 1
echo "${a}"
foo函数通过命令替换被调用。
有什么办法可以做到这一点吗?
根据下面的代码,是否有可能从下面的伪代码函数中获得$caller_method的值,无论函数的调用方是否正常地进行了函数调用(例如:mytest 1 ),还是使用了子style样式例如:echo "(mytest 1)"。
#!/bin/bash
function mytest() {
# THIS IS PSEUDOCODE
if $caller_method=directly; then
echo "THIS WAS CALLED DIRECTLY"
# Do other stuff
我有N目录,每个目录都包含空格分隔的.txt文件。我想遍历每个目录,并根据每个目录中的列值编写一个文件。下面是两个文件夹的示例:
folderA有一个名为fileA.txt的文件,folderB有fileB.txt。
fileA.txt含量
1 a
1 b
2 a
2 b
fileB.txt含量
1 a
1 b
2 a
2 b
在本例中,folderA和folderB中的期望输出是相同的;也就是说,基于第一列内容的文件1和2将在包含这些行的两个文件夹中创建。
1 (文件名)
1 a
1 b
2 (文件名)
2 a
2 b
分别使用。
到目前为止,我所做的事情如下:无法在各自的文件夹中写入文
我有这个bash脚本,它的工作是监视日志文件中某一行的出现。找到后,脚本将发出电子邮件警告,然后自行终止。由于某些原因,它一直在运行。如何确保终止下面的bash脚本:
#!/bin/sh
tail -n 0 -f output.err | grep --line-buffered "Exception" | while read line
do
echo "An exception has been detected!" | mail -s "ALERT" monitor@company.com
exit 0
done
我读过,您可以将I/O重定向到Bash中的各种构造(例如"if“和"while")。当我尝试这一点时,我注意到在if结构的末尾使用一个“AC.26”可以阻止我在if构造中覆盖的任何变量生效;但是如果我使用">“代替,那么变量修改就生效了。
#!/bin/bash
VAR_0='Unmodified'
if true
then
VAR_0='Changed'
fi | cat
echo "VAR_0: $VAR_0"
###########
VAR_1='Unmodified'
我注意到,如果我将循环的输出输送到管道中,bashfor循环中的变量范围似乎会发生变化。
例如,在这里,在循环之后,g保持不变:
$ g=bing; for f in foo; do g=fing; echo g in loop: $g; done; echo g after $g;
g in loop: fing
g after fing
而在这里,循环期间的更改却被遗忘了:
$ g=bing; for f in foo; do g=fing; echo g in loop: $g; done | cat; echo g after $g;
g in loop: fing
g after b
下面的脚本在shell中。test.sh
#! /bin/bash
connect_stat=$(db2 -x "connect to $DB_NAME USER $DB_USER using $DB_PASSWORD" )
db2 "SET SCHEMA=SCHEMA1"
while read line;
do
a=$(db2 -x "SELECT C.id FROM table C WHERE C.col1 IN ('$line)') with ur")
echo $a
done<inputs.txt
当我运行
我做了一小块代码来描述我的问题。
#!/bin/bash
function writeToFile(){
echo "$1" >> file.txt
}
function checkLetters(){
letters_array+=( $1 )
count=0
for letter in ${letters_array[*]}
do
if [[ "$1" == "$letter" ]]
then
count=$((count+1))
基本上,我试图退出一个包含循环的子subshell。这是代码:`
stop=0
( # subshell start
while true # Loop start
do
sleep 1 # Wait a second
echo 1 >> /tmp/output # Add a line to a test file
if [ $stop = 1 ]; then exit; fi # This should exit the subshel
问题首先:与父shell和我的tcsh环境相比,mc的子shell具有不同的提示。所有其他设置/变量/别名都在mc的子subshell中可用,似乎只有提示符没有正确地“传递”。我不知道为什么会这样。手册页说:
An extra added feature of using the subshell is that the prompt displayed by the Midnight Commander is the same prompt that you are currently using in your shell.
背景:,我正在使用mc.4.8.23,这是我在本地安装的
我知道这可能是个愚蠢的问题,但我正在尝试写我的第一个bash脚本,并且遇到了一些麻烦。它是一个备份脚本,它读取文本文件以获取要备份的目录列表,然后将它们存储在变量中,以便将变量值用作tar命令的输入。但是,当我将值/home存储在backupdirs文本文件中时,它会给出一个错误,说明/home是一个目录,并且它没有将它存储在变量中。我可以不将目录名存储在这样的变量中吗?我怎么才能绕过它?
#!/bin/bash
BACKUP_DIRS=
cat /root/backupdirs.txt |
{
while read line
do