简体   繁体   中英

Bourne Shell doesn't find unix commands on script

#!/bin/sh

echo "Insert the directory you want to detail"
read DIR
#Get the files:
FILES=`ls "$DIR" | sort`
echo "Files in the list:"
echo "$FILES"
echo ""
echo "Separating directories from files..."
for FILE in $FILES
do
    PATH=${DIR}"/$FILE"
    OUTPUT="Path: $PATH"
    if [ -f "$PATH" ]; then
        NAME=`echo "$FILE" | cut -d'.' -f1`
        OUTPUT=${OUTPUT}" (filename: $NAME"
        EXTENSION=`echo "$FILE" | cut -s -d'.' -f2`
        if [ ${#EXTENSION} -gt 0 ]; then
            OUTPUT=${OUTPUT}" - type: $EXTENSION)"
        else
            OUTPUT=${OUTPUT}")"
        fi
    elif [ -d "$PATH" ]; then
        OUTPUT=${OUTPUT}" (dir name: $FILE)"
    fi
    echo "$OUTPUT"
done

I get this output when running it (I ran using relative path and full path)

$ ./problem.sh
Insert the directory you want to detail
.
Files in the list:
directoryExample
problem.sh

Separating directories from files...
Path: ./directoryExample (dir name: directoryExample)
./problem.sh: cut: not found
./problem.sh: cut: not found
Path: ./problem.sh (filename: )
$ 
$ 
$ ./problem.sh
Insert the directory you want to detail
/home/geppetto/problem
Files in the list:
directoryExample
problem.sh

Separating directories from files...
Path: /home/geppetto/problem/directoryExample (dir name: directoryExample)
./problem.sh: cut: not found
./problem.sh: cut: not found
Path: /home/geppetto/problem/problem.sh (filename: )
$

As you can see I received " cut: not found " two times when arranging the output string of file types. why? (I am using Free BSD)

PATH is the variable used by the shell to store the list of directories where commands like cut might be found. You overwrote the value of that variable, losing the initial list. The easy fix is to not use PATH in your for loop. The more complete answer is to avoid all variable names consisting of only uppercase letters, as those are reserved for use by the shell. Include as least one lowercase letter or number in all your own variable names to avoid interfering with current (or future) variables used by the shell.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM