Cannot increment a variable in bash

拜拜、爱过 提交于 2019-12-23 01:16:33

问题


I'm trying to create a script to count the number of hidden and non-hidden files in a folder where the script is run. However, I run into an issue where I cannot increment variables.

#!/bin/bash

#A simple script to count the number of hidden and non-hidden files in the folder this script is run in

#Variables to store the number of hidden and non-hidden files and folders
#Variables with a 'h' at the end represent hidden items

files=0
fileh=0

#List all files and folders
#Use grep to folder entries beginning with '-', which are files
#Return the 9th word in the string which is the filename
#Read the filename into the variable 'fls'
ls -al | grep ^- | awk '{print $9}' | while read fls

#If the filename begins, with a dot, it is a hidden file
do
    if [[ $fls == .* ]]
    then
        #Therefore increment the number of hidden files by one
        let fileh++
    else
        #Else, increment the number if non-hidden files by one
        let files++
    fi
done

#Print out the two numbers
echo $files 'non-hidden files'
echo $fileh 'hidden files'

#When I run this script, the output is always zero for both variables
#I don't know why this doesn't work?!

The output of this script is as follows:

jai@L502X~$ ./script.sh 
0 non-hidden files
0 hidden files

回答1:


What happens on the right hand side of a | happens in a subshell. Changes to variables in a subshell don't propagate back to the parent shell.

Common workaround: don't use a pipe, use Process substitution:

while read fls ; do
   ...
done < <(ls -al | grep ^- | awk '{print $9}')



回答2:


If you want to increment a variable using let, you have to quote your expression, like in

let "i++"

However, I personally prefer to use the double-parentheses syntax, which is

((i++))
# or, if you want a pre-fixed increment
((++i))

Plus, you can use a way shorter syntax for your if statement, using && and ||:

[[ $fls == .* ]] && ((++fileh)) || ((++files))



回答3:


Not the answer to the "increment" question, but a much easier script to do what you're trying to do:

files=`find . -type f`
echo "non-hidden files " `echo "$files" | egrep -v "[/]\.[^/]+$" | wc -l`
echo "hidden files " `echo "$files" | egrep "[/]\.[^/]+$" | wc -l`



回答4:


Quote the variable increment

let "fileh++"


来源:https://stackoverflow.com/questions/27677757/cannot-increment-a-variable-in-bash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!